单例模式与volatile和synchronized关键字

B5WANG 2020-10-25 03:23:10
看到一些讨论volatile用法的文章里面把单例模式的代码写成了如下的样子,
class Singleton {
private static volatile Singleton singleton;

private Singleton() {}

public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
为什么这样写那?
把getInstance() 写成同步方法不就完事了吗???
public static synchronized Singleton getInstance() { ... }

兄弟们有什么想法,还请指教,谢谢。
...全文
1039 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepSayingNo 2020-10-26
  • 打赏
  • 举报
回复
楼主说得很对,而且按楼主的方法做了以后,判空只用做一次了。 个人觉得这个代码只是一个很简单的例子,实际的代码创建一个实例对象还有很多初始化的工作,synchronized关键字本身就提供了在方法上、代码块上、变量上加锁多个维度,主要是根据不同情况采取不同方式。 是因为先确定了锁必须要加在代码块上然后再去考虑锁失效的问题,才有了非要在private static volatile Singleton singleton; 这个上面加volatile
qybao 2020-10-26
  • 打赏
  • 举报
回复
不会死锁(只有一把锁满足不了死锁条件,除非在getInstance方法里发生死循环而无法退出方法),只是效率低下。
B5WANG 2020-10-25
  • 打赏
  • 举报
回复
引用 1 楼 tianfang 的回复:
synchronized在方法上, 粒度高了,方法调用频繁,每次都要上锁,降低调用效率,极端情况可能会致死锁

的确是,每次调用都是同步的,效率变低了。但是怎么可能有死锁那?单个锁无论如何也不会死锁啊?
qybao 2020-10-25
  • 打赏
  • 举报
回复
这种单例模式常见的问题问的太多了。
LZ自己参考以下链接,双检锁 部分的说明吧
https://blog.csdn.net/fly910905/article/details/79286680
tianfang 2020-10-25
  • 打赏
  • 举报
回复
synchronized在方法上, 粒度高了,方法调用频繁,每次都要上锁,降低调用效率,极端情况可能会致死锁

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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