赞
踩
synchronized通过排他锁的方式就保证了同一时间内,被synchronized修饰的代码确保是单线程执行的,这就满足了as-if-serial在单线程中一定是含有序性。但是因为只能保证有序性,不能保证指令重排序,需要用volatile来保证
用双重判空(DCL):第一重判空:因为 synchronize是消耗性能较严重的操作,所以先判空看看到底要不要同步;
中间加锁: 存在有几个线程同时运行到这,为了安全需要上锁,阻塞某些线程
第二重判空: 就是很常见的,如果为空就需要实例化,不为空就返回这个已经实例化对象;
2.有序性
从JVM底层来讲,volatile和9条happen-before原则都有一个叫“内存屏障”的东西保证线程实行的顺序,否则可能会出现重排序情况造成执行顺序错乱;
内存屏障作用:1.确保指令重排序时不会将后面的指令放在屏障之前的位置,也不会将前面的指令放在屏障后面执行;2.将修改的值刷新到主内存而非工作内存中(可见性)
在每个volatile写操作的前面插入一个StoreStore屏障。在每个volatile写操作的后面插入一个StoreLoad屏障。

在每个volatile读操作的后面插入一个LoadLoad屏障。在每个volatile读操作的后面插入一个LoadStore屏障。

9条happen-before原则举例:
1.数据依赖原则: A 发生在B之后 ,B发生在C之后,A一定发生在C之后;
2.volatile原则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读..等等
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。