当前位置: 首页 > 网络应用技术

Java并发:挥发性和同步之间的本质区别是什么?

时间:2023-03-08 10:33:06 网络应用技术

  波动性和同步之间的唯一区别是,波动性仅确保记忆的可见性,并同步也确保了内存的可见性 - 并确保它是不同的,也就是说,只有一个线程可以得到锁定,而其他线程正在等待对于锁。

  同步可以确保共享数据只能同时更新共享数据。

  但是挥发性不能,因为波动性只能确保单个读取或写作操作是一个原子,但是共享数据的修改通常通常依赖于共享数据的旧值,例如,在旧价值的旧价值上添加1数据 - 然后添加1 - 最后一篇文字实际包含3个操作,因此挥发性无法保证实际同步。

  挥发性的应用程序方案是什么?在修改共享数据时,它不依赖共享数据(本质是共享数据的旧值),右侧的变量还必须确保线程是安全的(本质上是因为右侧的变量等同于阅读操作,然后更新共享数据以更新共享数据的时间,其中包括两个操作:1。读取右第2个变量的值2.续订共享数据。更新操作是原子,但是有一个操作可以读取右侧的正确变量。一个原子操作)。

  参考:https://titanwolf.org/network/articles/article?AID = 6109465A-AB8F-4F01-B193-CAAF5A1A79D6#gsc.tab = 0 //本文的作者用Java并发编程编写了实际战斗。

  模范

  示例2原子

  注意:在JDK中实施的原子龙的数据是波动的,等于我们定义数据时使用valotile,但是现在它是一个jdk包装的原子能来帮助您做到这一点,但是角色和本质是相同的。的。

  为什么单个读数或编写原子操作?这是由Java规范保证的。

  确切地说,非长/双数据是一个原子。为什么?因为长/double是64位,而Java规范仅保证32位数字是原子操作。

  当通过线程更新共享数据时,其他线程可以立即读取最新值(SO值可见性)。也就是说,如果您不添加挥发性,则可能无法读取最新值;如果添加,则可以读取最新值。

  为了确保相互谴责,也就是说,只有一个线程可以更新和共享数据。例如,代码的特定级别是锁定共享数据的方法或代码块。同时,只有一个线程可以执行此方法或代码块。块不能更新。

  可见的是什么?同步也可以确保可见性。visibleness意味着线程A修改共享数据,线程B可以看到最新数据。这似乎是胡说八道,事实也是一个胡说八道 - 这主要与Java内存模型有关。

  了解Java内存模型及其并发。

  Java内存模型的主要目标:定义程序中每个变量的访问规则。

  Java线程之间的通信由Java内存模型控制(本文中称为JMM)。

  所有变量的存储在主内存中,每个线程也都有自己的工作记忆。线程的工作内存保留了线程使用的变量的主内存副本的副本。线程到变量的所有操作都必须在工作内存的工作内存中,而不是直接读取主内存中的变量。不同的线程无法直接访问对手工作内存中的变量。线程之间的变量的传输需要由主内存完成。

  线程间隔通信:

  线程只能与线程通信,然后将线程工作内存与主内存传达。

  不能相互传达不同线程的工作记忆。它必须传递主内存。例如,线程1将数据写入线程工作内存1,然后线程工作内存将数据写入主存储器;线程工作内存2从主内存读取数据,然后线程2可以从线程工作内存2读取数据。

  建筑学

  CPU维度 - 架构图

  线程尺寸 - 架构图

  注意:线程尺寸的体系结构图可能难以理解,因为为什么有此架构图?为什么这样?本质是由于CPU维度的架构。

  CPU维度的体系结构图的本质是,现在它是CPU。每个CPU都有自己的高速缓存。为什么每个CPU都有自己的高速缓存?它在内存中是否已经可用(也就是说,是体系结构中的主要内存)?因为高速缓存是快速,高速缓存的速度,高于内存,并且高速度内存小于内存,内存越小,内存越快。

  各种存储设备的访问速度如下:

  寄存器是最快的,您可以在时钟周期中访问它。

  第二个是高速缓存,可以在几个时钟周期内访问。

  可以在数十个或数百个时钟周期内访问普通内存。

  https://zhuanlan.zhihu.com/p/37749443

  内存模型非常虚拟和毫无意义。主要原因是,如果您不了解内存模型,那么您不理解线程的可见性 - 因为我不知道为什么,线程1已修改了共享数据,但是线程2可能不会能够读取共享共享。数据的最新值。原因是,在CPU/线程和内存中提到了内存模型,即上述CPU维度的体系结构图,以及中间内存(也就是,高速缓存/线程工作内存)。

  还有一个中介,存在一个不一致的问题。

  如何解决数据不一致的问题?同步或波动性可以保证线程1可以修改共享数据,线程2可以读取共享数据的最新值。

  同步和挥发性之间的唯一区别是同步具有另一个功能,即相互排斥的功能,也就是说,同时只有一个线程可以获得对象的锁定。其他线程只能等待该线程同时同时释放锁定。只有一个线程执行方法或代码块:也就是说,只能更新一个线程并共享数据。

  https://sementfault.com/a/1190000020770155

  https://www.zhihu.com/question/38816432