Java面试题:不使用锁如何实现线程安全的单例?(2)
导读:Java面试题,但是,如果真要较真的话,ClassLoader的loadClass方法在加载类的时候使用了synchronized关键字。 也正是因为这样, 除非被重写,这个方法默认在整个装载过程
Java面试题
但是,如果真要较真的话,ClassLoader的loadClass方法在加载类的时候使用了synchronized关键字。
也正是因为这样, 除非被重写,这个方法默认在整个装载过程中都是同步的(线程安全的)。
那么,除了上面这三种,还有一种无锁的实现方式,那就是CAS。
public class Singleton {
// 使用了 AtomicReference 封装单例对象
private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<Singleton>();
private Singleton() {}
public static Singleton getInstance() {
while (true) {
// 使用 AtomicReference.get 获取
Singleton singleton = INSTANCE.get();
if (null != singleton) {
return singleton;
}
// 使用 CAS 乐观锁进行非阻塞更新
singleton = new Singleton();
if (INSTANCE.compareAndSet(null, singleton)) {
return singleton;
}
}
}
}
用CAS的好处在于不需要使用传统的锁机制来保证线程安全。
但是我们的实现方式中,用了一个while循环一直在进行重试,所以,这种方式有一个比较大的缺点在于,如果忙等待一直执行不成功(一直在死循环中),会对CPU造成较大的执行开销。
以上是IT袋网网关于Java面试题 和 不使用锁如何实现线程安全的单例的技术经验小知识,以上内容供大家学习了解!
相关阅读
-
什么是混合云 有哪些优缺点?
本文核心导读:什么是混合云的电脑方面的小经验,接下来分享详细内容。 混合云结合了公共云和私有云的特点,允许数据和应用程序在两者之间进行流动。 混合云的多样性 混合云可以由多
-
如何在Firefox和Chrome中轻松截取完整网页截图
关于这个如何在Firefox和Chrome中轻松截取完整网页截图方面的知识,一起跟随小编看看吧! Firefox 浏览器内置了截屏工具,你可以用它对整个网页进行截屏。Chrome 浏览器也有同样的功能。 截屏
-
Nacos服务注册与发现的原理详解
这些知识你了解吗?Nacos服务注册与发现的原理详解的相关知识,一起来了解了解吧。 1.微服务在启动将自己的服务注册到Nacos注册中心,同时发布http接口供其他系统调用,一般都是基于Sprin
-
香港服务器遭受DDoS攻击后如何恢复运行?
这些方法你知道吗?香港服务器遭受DDoS攻击后如何恢复运行方面的内容,如有不对的地方欢迎指正! 您是否发现流量异常上升?您的网站突然崩溃了吗?当您注意到这些迹象时,可能是在陷入了


