jvm做的一种优化策略,为了提高cpu的利用率,更改了指令执行顺序。
单线程下:jvm保证的指令执行的基本有序性,即happen-before原则,更改后顺序不影响原有结果。
对于多线程不保证。
为了兼容多线程,还有以下重排原则,可以通过代码层面保证重排不影响执行结果
1、锁定规则:这个规则比较好理解,无论是在单线程环境还是多线程环境,一个锁处于被锁定状态,那么必须先执行unlock操作后面才能进行lock操作。
2、volatile变量规则:这是一条比较重要的规则,它标志着volatile保证了线程可见性。通俗点讲就是如果一个线程先去写一个volatile变量,然后一个线程去读这个变量,那么这个写操作一定是happens-before读操作的。
3、传递规则:提现了happens-before原则具有传递性,即A happens-before B , B happens-before C,那么A happens-before C
4、线程终结规则:假定线程A在执行的过程中,通过制定ThreadB.join()等待线程B终止,那么线程B在终止之前对共享变量的修改在线程A等待返回后可见。
---------------------------------------------------------------------------
网友评论