聊一聊 Java 的单例 (查看原文)

本文由BarryZhang原创,同时首发于diycode.cc、barryzhang.com,简书非商业转载请注明作者和原文链接。1. 前言单例(Singleton)应该是开发者们...

jianshu.com   
评论 (10)
Thumb

XianfengSong 2017-04-12 10:42

在3.4这节,singleton = new Singleton()这句不是已经在synchonized块内部了么,根据happenbefore规则是不是已经保证singleton可见性了呢
Default avatar

u301492 2017-04-12 12:52

我的理解是:synchonized能保证同步,但是不能禁止内部代码的指令重排。 因为new Singleton()这句是没有原子性的,所以可能会有一个『singleton已经不为null但是仍没有完成初始化』的中间态,这时候另一个线程在读取singleton的值时,它已经不为null了,但是还没有完成初始化,所以会出问题。 而加上volatile的作用在于,它能够禁止这种事情发生,在new Singleton()这句话执行完毕之前,另一个线程不能读到中间状态的值。
Thumb

芝麻神谷 2017-04-12 14:46

Thumb

elephant 2017-04-12 16:15

太棒了👏,学习了
Thumb

u351582 2017-04-12 18:49

博客园的吧,转载不注明?
Thumb

mengxiangli 2017-04-12 19:27

很久以前就有
Thumb

u210310 2017-04-12 20:06

又见双重检查,请细究
Thumb

生性浪漫的猪 2017-04-12 22:30

sync以后这个线程返回的instance的值,在另外一个进入sync部分的不一定立即可见。因为不是violate的,在cpu的cache的,而不是主存共享的那个,这样在内部的第二个判断为空就又成立了。再初始化一次。
Thumb

ScyBernate 2017-04-15 06:11

Syn 是独占锁吧
Thumb

pangzi9 2017-04-18 14:49

要么enum,要么内部类,这已经是公认的单例模式的最佳实现方式了,enum,还能解决序列化的单例问题,应该毫不犹豫的使用。
Post wxa image%2fd8f09b93915f479d9f8aca1292a47026 用微信扫描
小程序码阅读原文

开发者头条

程序员分享平台