双重锁的单例模式

长安以北 2020-06-09 09:14:48
public synchronized static Single newInstance() {
if (single == null) {
synchronized (Single.class) {
if (single == null) {
single = new Single();
}
}
}
return single;
}
这么加锁对不对
...全文
7858 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
w401557499 2020-06-23
  • 打赏
  • 举报
回复
你说的这个单例叫dcl(double check lock)双重检查,不是双重锁,方法上加锁了,方法里面就不用了加锁了,应该把方法上的synchronized 去掉,声明single变量为volatile修饰。 https://www.cnblogs.com/hexinwei1/p/9909555.html
冰思雨 2020-06-23
  • 打赏
  • 举报
回复
静态方法上的synchronized 和 方法内部的 synchronized 代码块,两者选择一个即可。 楼主这样上两次锁,没有啥意义。两种用法,都是给Single.class上锁。
zy_think123 2020-06-23
  • 打赏
  • 举报
回复


public static Single newInstance() {
        if (single == null) {
            synchronized (Single.class) {
                if (single == null) {
                    single = new Single();
                }
            }
        }
        return single;
    }
即便这样加锁之后也可能由于编译器优化问题,导致报错。 关于这一点,可以参考我的blog : https://blog.csdn.net/zy353003874/article/details/106727869
沁海棠 2020-06-22
  • 打赏
  • 举报
回复
https://blog.csdn.net/qinhaotong/article/details/87884048
北京天很蓝 2020-06-19
  • 打赏
  • 举报
回复
方法上不用加锁,或者下不用加锁,你这样啥意思
maradona1984 2020-06-10
  • 打赏
  • 举报
回复
不对,你的双重检测毫无意义
qybao 2020-06-09
  • 打赏
  • 举报
回复
你在方法上加了锁,那就注定只能有一个线程能进入方法,那你在方法内再加锁还有啥意义?

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧