We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
public class Singleton { private static Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { //双重检查存在的一样在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。 instance = new Singleton(); } } } return instance; } }
被synchronized修饰的语句块有Happens-Before规则,线程B在线程A之后进入同步块一定可以看到instance!=null
The text was updated successfully, but these errors were encountered:
对啊,所以才需要双重检查
Sorry, something went wrong.
‘ 双重检查存在的一样在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。 ’ 这句注释不对。
我的注释:双重检查存在的一样在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。
双重检查存在的一样在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。
你的回复:被synchronized修饰的语句块有Happens-Before规则,线程B在线程A之后进入同步块一定可以看到instance!=null
我觉得注释是没有错的,你说的线程B可以看到instance!=null不代表就线程B不会再执行
instance = new Singleton();
方法了,所以为了避免线程B再次执行一次初始化,所以synchronized修饰的语句块再加了一个if判断,你觉得有问题我们可以继续探讨,项目主页有技术群的二维码和我的微信
No branches or pull requests
被synchronized修饰的语句块有Happens-Before规则,线程B在线程A之后进入同步块一定可以看到instance!=null
The text was updated successfully, but these errors were encountered: