加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Threadsafe Singleton没有Java同步?

发布时间:2020-12-15 03:02:57 所属栏目:Java 来源:网络整理
导读:我有一个多线程应用程序和一个单例类: public final class Singleton { private static MyClass mc; public static final Object getInstance() { if(mc == null) { mc = new MyClass(); } return mc; }} 当然,这在一般的多线程场景中不起作用.但请考虑以下
我有一个多线程应用程序和一个单例类:
public final class Singleton {

    private static MyClass mc;

    public static final Object getInstance() {
            if(mc == null) {
                mc = new MyClass();
            }
            return mc;
    }

}

当然,这在一般的多线程场景中不起作用.但请考虑以下情形:

>一开始只有一个线程
>这一个线程第一次调用getInstance(),以便初始化mc.
>之后,第一个线程启动所有其他线程.

我的假设:

这应该有效,因为mc字段的初始化和对象的构造发生在所有后续的Thread.start()调用启动其他线程之前.并且线程的Thread.start()在该线程的所有其他操作之前发生.因此,mc的初始化发生在所有其他线程中的所有操作之前,以便getInstance()将为所有线程返回正确的值.

这个假设是对的吗?为什么/为什么不呢?

解决方法

你的分析确实很好.

确切地说:在一个线程上发生的所有事情都会在关系之前发生(很明显,就是这样说:“如果x和y是同一个线程的动作,x在程序顺序中出现在y之前,那么hb(x,y).“)

然后,JLS的17.4.5继续说出以下内容:

“在启动线程中的任何操作之前,都会在线程上调用start().”

因此,在单例实例化和启动的线程之间的顺序之前有一个明显的发生,因此它们保证看到最新值.

简单地说:创建的线程可以保证在创建之前看到它的父进程所做的一切,否则并发编程几乎是不可能的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读