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

时间:2015-10-03 21:05:51

标签: java multithreading spring hibernate

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

1 个答案:

答案 0 :(得分:1)

你的问题非常广泛。

你可以从https://en.wikipedia.org/wiki/Thread_safety开始,它只是一个长途旅行的开始,它将带你通过http://www.cs.umd.edu/~pugh/java/memoryModel/到java的内部,然后到现代CPU的内部。

在这件事背后隐藏着一些事情:

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

(例如,一个网络查询通过它的id = 8374请求GET人,并且其他请求获取所有人以获取所有已知用户)

什么可能出错 - 一个调用返回用户是唐纳德并列出所有用户返回他是约翰(从其他线程观察陈旧值)。

同样的问题可能发生在“较低级别” - 例如,一个线程更改计数器=计数器+ 1,而其他线程正在执行相同操作。如果一切正常并且计数器的起始值= 3,则第一个将取3,加1,并设置计数器= 4.然后第二个将来,将取4,加1,并将计数器设置为5.

如果出现问题,你可能会遇到第1个将计数器值作为3的情况,将值带入内存并暂停内部问题片刻。在那一刻,第二个将观察到计数器是3并且将它带入它的内存,将进行数学运算并将存储计数器= 4.第一个将恢复执行,将执行3 + 1(不从计数器重新读取值)并将存储4到柜台。结果 - 你“丢失”了一个增量。

在Web级别,java级别,CPU级别存在相同的问题。

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

“不变性” - 价值被分配一次而后永不改变的概念 - 可以尝试通过使用最终变量来实现。

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

等。它是计算机科学的重要领域。请转到前面提到的维基页面。

在spring / hibernate的情况下 - 你不能使一切都是不可变的,所以你将使用同步块创建在单线程中执行状态的代码。可能在java代码中,可能在db代码中。