public class SynchronizeTest {
static String ii ;
public static void test(){
if(ii ==null){
synchronized ("test"){
System.out.println("很多次");
if(ii == null){
ii = "进来了。";
System.out.println(ii);
}
}
}
System.out.println("被赋值后的:"+ii);
}
public static void main(String[] args) {
for (int i = 0; i<10; i++){
new Thread(new Runnable() {
@Override
public void run() {
SynchronizeTest .test();
}
}).start();
}
}
}
使用双重校验锁的结果如图所示,
在多线程的情况下,会有多个线程进入第一次 是否为null的判断被synchronize阻塞,在仅有一个线程获取锁并给ii赋值后,ii就不再为null了。
这时阻塞的线程进入同步代码块,就不能再次给ii赋值,也就保证了ii只被赋值一次。