【高并发专题】-java线程安全-有序性

我们编写的代码计算机是不能直接识别的(汇编语言除外),以java为例,编写后的代码需要通过编译器编译成.class字节码文件,再由jit编译成机器码运行在Jvm中,而且在jvm机器码的运行顺序还要经过cpu调度,在编译和cpu调度期间,为了提高性能,编译器和cpu可能会对代码顺序进行重排序,所以代码实际运行的顺序未必与我们书写的代码顺序保持一致.在单线程的情况下,由Happens-before规则的存在,保证了代码的先天有序性,即不需要任何额外的代码控制即可保证有序性,java内存模型一个列出了八种Happens-before规则,如果两个操作的次序不能从这八种规则中推倒出来,则不能保证有序性。

※程序次序规则:一个线程内,按照代码执行,书写在前面的操作先行发生于书写在后面的操作。

※锁定规则:一个unLock操作先行发生于后面对同一个锁的lock操作

※volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作

※传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C

※线程启动原则:Thread对象的start()方法先行发生于此线程的每一个动作

※线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生

※线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()方法返回值手段检测到线程已经终止执行

※对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始

但在多个线程执行时,Happens-before规则就不一定可以奏效了,所以我们需要额外的操作来保证代码执行的顺序正确.

比如可以使用volatile,synchronized,lock来保证代码执行的顺序.

发布了89 篇原创文章 · 获赞 70 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/lovexiaotaozi/article/details/90901709