Volatile和Synchronized有什么区别?Volatile能不能保证线程安全?DCL(Double Check Lock)单例为什么要加Volatile?

1.Synchronized关键字是用来加锁的,Volatile只是保持变量的线程可见性,通常适用于一个线程写,多个线程读的场景。

2.Volatile关键字不能保证线程安全,因为volatile只能保证线程的可见性,不能保证原子性。

3.Volatile防止指令重排。

        什么是指令重排呢:

                比如说我们new一个对象,在JVM中就会分为三个步骤

                        1.分配内存

                        2.初始化

                        3.建立指针对应关系

        指令重排就是原本我们new对象时按照1->2->3的顺序进行的,在进行编译时顺序就可能变成1->3->2,这种情况下在单线程模式下一般不会出现问题,但在多线程情况下可能在进行完1->3时另一个线程出现使用这个还未初始化的对象,这样就会出现线程安全问题。

volatile禁止指令重排就保证了指令按照1->2->3的顺序进行

DCL单例模式

 volatile禁止指令重排可防止DCL单例模式在高并发情况下,指令重排造成安全问题。

模式作为最常用的设计模式之一,在Java中有多种实现方式。了解这些实现方式的线程安全特性,对于开发高可靠性的应用至关重要。《java 23种设计模式》这本资料将为你提供详细的实现方式对比分析,非常适合你当前的学习需求。 参考资源链接:[java 23种设计模式](https://wenku.youkuaiyun.com/doc/87buzdyzf3?spm=1055.2569.3001.10343)Java中实现模式主要有以下几种方式: 1. 饿汉式:类载时就完成初始化,类载较慢,获取对象的速度快,线程安全。代码示如下: public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } 2. 懒汉式:类载不会初始化,调用getInstance()时才初始化,线程不安全。可以通过synchronized关键字来保证线程安全。代码示如下: public class Singleton { private static Singleton instance = null; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 3. 双重检查锁定(DCL):第一次判断是为了避免不必要的同步,第二次判断是为了保证线程安全。代码示如下: public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } 在实际应用中,可以根据性能需求资源消耗选择合适的模式实现方式。每种方式都有其适用场景潜在风险,因此深入理解它们的线程安全特性是必不可少的。《java 23种设计模式》将为你展示更多细节最佳实践,帮助你在Java项目中正确应用模式,确保线程安全。 参考资源链接:[java 23种设计模式](https://wenku.youkuaiyun.com/doc/87buzdyzf3?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值