A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 瑞雪雄起 中级黑马   /  2015-10-10 18:46  /  371 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马