并发三大特性

本文详细介绍了并发编程中的三大特性:原子性、有序性和可见性,以及如何通过synchronized、Lock和volatile来确保这些特性。原子性保证操作不可中断,有序性确保代码执行顺序,而可见性则关乎共享变量在多线程环境中的状态同步。volatile通过内存屏障来防止指令重排序,确保变量更新的可见性。同时,文章还提及了手动添加内存屏障的方法以及Unsafe类的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

并发三大特性:

  • 原子性:
      原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程影响。可以通过 synchronized和Lock实现原子性,volatile不能保证原子性。
  • 有序性:
      有序性是指对于单线程的执行代码,我们总是认为代码的执行是按顺序依次执行的,即使指令重排也要保证执行结果不受影响。
  • 可见性:
      共享变量在不同线程的工作内存可见,volatile可以解决可见性问题(能否及时可见),不加volatile也可能可见,但不一定及时。synchronized和Lock也可以保证可见性,因为它们可以保证任一时刻只有一个线程能访问共享资源,并在其释放锁之前将修改的变量刷新到内存中。

手动添加内存屏障:
使用UnSafe类

UnsafeInstance.reflectGetUnsafe().fullFence();

由于UnSafe类是由启动类加载器加载,只能通过反射获取:

public class UnsafeInstance {
    public static Unsafe reflectGetUnsafe() {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            return (Unsafe) field.get(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

volatile内存语义
  volatile可以保证可见性,禁止指令重排序(DCL需要添加volatile)。通过内存屏障实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值