本帖最后由 瑞雪雄起 于 2015-10-10 18:49 编辑
- if(Instance==null) 该语句非原子操作,它首先getstatic(read 操作),然后才是判断操作,在某一时刻只有一个线程访问read 操作的话,那么根据流水线规则,在第一个线程完成read操作之后,它将进入判断操作,那么此时另一个线程即可进行read操作。那么此时它读到的值也是null。所以要在synchronized块中进行第二次判断。那么它此时就需要重新进行读取和判断.因为第一个线程已经在synchronized块中修改了,所以给改的值迅速写回主存(putstatic).
- synchronized(Singleton.class)
- {
- if(Instance==null)
- Instance=new Singleton()
- }
- return Instance;
复制代码
|
|