总结java内存数据的可见性和dcl的根本问题原因

    本文主要内容为网络收集,经过加工处理,参考文章见附录。
    说到java的并发编程,就必须要了解在并发中的一些数据的读取,特别是关键性数据的读取。为防止由于多线程的访问对于数据的读取产生读取顺序上的不一致,java引入了内存模型的概念,其根本概念即happen-before规则。

    happen-before规定在jvm实现内部,各个运行中的变量的读取顺序以及它对于多个线程在读取上的可见性。因为,在多个线程进行同时操作时,变量会根据每个线程保存它自己的一个副本(类似于clone),并且在必要的时候同主存(即原始的数据)同步一次。正是因为有这样的概念,在多线程中,我们看到的对象的数据值,可能就不是最新的一个数据值,而是一个过期的数据,或者说是一个错误的数据。而基于想象中正确的逻辑进行编程的话,就可能出现一些问题。
    happens-before就是“什么什么一定在什么什么之前运行”,也就是保证顺序性。即在多个线程或者同一个线程的不同操作之间,要满足说哪个操作一定会在哪个操作之前发生。那么在相对靠后的操作中使用的变量所读取的值,则一定是在操作之前写入的数据,不会读取到还未写入的值。

继续阅读“总结java内存数据的可见性和dcl的根本问题原因”