繁体   English   中英

我在哪里可以找到 Java 线程安全对象的概念描述?

[英]where can I find java thread safe objects concept description?

我多次听说java应用程序结构创建的现代概念之一是有效的线程安全对象概念。 这意味着我们只在我们的应用程序中使用最终实体类。 我在哪里可以找到该概念的综合指南? 如何使用 DAO 和 DTO 方法将此概念应用于基于 hibernate 和 spring 的普通 MVC Web 应用程序?

你的问题很广泛。

您可以从https://en.wikipedia.org/wiki/Thread_safety开始,这只是一个漫长旅程的开始,它将带您穿越http://www.cs.umd.edu/~pugh/java/memoryModel /到 java 的内部结构,然后再到现代 CPU 的内部结构。

这件事的背后是以下几件事:

  • state - 某个值等于某个“X”,例如姓名 John
  • 可变状态 - 某个时候某个值是约翰,现在应该是唐纳德
  • 执行流程 - 一一执行的程序步骤序列
  • 线程 - 流程的执行者
  • 多线程 - 您的代码有多个并行执行的流程

(例如,一个网络查询通过 id=8374 请求 GET person 和其他请求 GET all people 以获取所有已知用户)

可能出现什么问题 - 一个调用返回该用户是 Donald 并列出所有返回他是 John 的用户(从其他线程观察到陈旧值)。

同样的问题可能发生在“较低级别”——例如,一个线程更改了 counter = counter + 1,而另一个线程也在做同样的事情。 如果一切正常,计数器的起始值= 3,第一个将取3,加1,并设置计数器= 4。然后第二个来,取4,加1,并将计数器设置为5。

如果出现问题,您可能会遇到这样的情况,即 1st 将计数器的值设为 3,将值存入内存并因内部问题暂停片刻。 在那一刻,第二个将观察到计数器为 3 并将其放入内存中,进行数学运算并存储计数器 = 4。第一个将恢复执行,将执行 3 + 1(不重新读取计数器的值)并将存储 4 以进行反击。 结果-您“丢失”了增量之一。

同样的问题存在于 web 级别、java 级别和 CPU 级别。

解决此问题的主要方向是:

“不变性” - 值被分配一次并且之后永远不会改变的概念 - 可以尝试通过在变量上使用 final 来实现。

“同步” - 您可以使用同步关键字将代码的某些部分标记为仅作为一个原子操作执行而不会被其他线程交错(第二个线程将等到第一个线程完成所有步骤)。

等等,这确实是计算机科学的一大领域。 请访问前面提到的维基页面。

在 spring/hibernate 的情况下 - 你不能让所有的东西都是不可变的,所以你将创建使用同步块在单线程中改变状态的代码。 可能在 java 代码中,也可能在 db 代码中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM