Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪里可以找到java线程安全对象概念描述?_Java_Multithreading_Spring_Hibernate - Fatal编程技术网

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

哪里可以找到java线程安全对象概念描述?,java,multithreading,spring,hibernate,Java,Multithreading,Spring,Hibernate,我听过很多次,java应用程序结构创建的现代概念之一就是有效的线程安全对象概念。这意味着我们只在应用程序中使用最终实体类。我在哪里可以找到这一概念的全面指南?如何使用DAO和DTO方法将这个概念应用到基于hibernate和spring的普通MVC web应用程序中 你的问题真的很广泛 您可以从开始,这将只是一个漫长旅程的开始,它将带领您了解java的内部结构,然后深入到现代CPU的内部结构 这背后有以下几点: 状态-某些值等于某个“X”,例如名称John 多变的状态——某个时刻,某个值是Jo

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

你的问题真的很广泛

您可以从开始,这将只是一个漫长旅程的开始,它将带领您了解java的内部结构,然后深入到现代CPU的内部结构

这背后有以下几点:

  • 状态-某些值等于某个“X”,例如名称John
  • 多变的状态——某个时刻,某个值是John,现在应该是Donald
  • 执行流-逐个执行的程序步骤的顺序
  • 线程-流的执行器
  • 多线程-您的代码有多个并行执行的流
(例如,一个web查询请求通过id=8374获取person,其他请求获取所有person以获取所有已知用户)

可能出错的地方-一个调用返回用户是Donald,并列出所有用户返回的他是John(从其他线程观察到陈旧值)

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

若出现问题,你们可能会遇到这样的情况:1号将计数器的值取为3,将值记在内存中,并将暂停片刻以解决内部问题。在那一刻,第二个将观察到计数器是3,并将其放入内存中,进行数学运算并存储计数器=4。第一个将继续执行,执行3+1(不从计数器重新读取值),并执行存储4到计数器。结果-您“丢失”了一个增量

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

解决这一问题的主要方向是:

“不变性”——即赋值一次且此后永不改变的概念——可以尝试通过使用final on变量来实现

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

这是计算机科学的一大领域。请转到前面提到的wiki页面


在spring/hibernate的情况下,您不能使所有内容都是不变的,所以您将创建使用同步块改变状态以在单个线程中执行的代码。可能在java代码中,也可能在db代码中。

查找不可变对象…最终实体类…没有意义。
final
类是一个不能扩展的类,但我认为您所说的是一个不可变的类(即,只有final字段的类)。不可变类本质上是线程安全的,因为在实例完全构建之前,无法在线程之间共享它的实例,并且在实例构建之后也无法修改它。“线程安全”是关于管理共享的、可变的状态。如果一个对象是不可变的,那么当它被共享时就不会有“线程安全”问题。我在哪里可以找到综合指南。。。?如果您还没有完成Java并发教程,那么这将是一个很好的开始: