多线程安全问题-volatile & atomic

volatile在Java中用于处理多线程安全,确保内存可见性和防止指令重排。它使得线程从共享内存而非本地副本获取变量值。同时,文章提到了原子变量如Atomic类,用于解决ABA问题,而CAS算法在不使用锁的情况下实现原子操作。相比synchronized,volatile不涉及锁资源,不会引起阻塞。
摘要由CSDN通过智能技术生成

volatile

是java种用于多线程安全问题的关键字。

  1. 保证多线程间内存可见性
    每个线程都有拷贝一个变量副本,线程修改值时只会修改线程本地的副本值。其他线程并不知道值已经被修改。

加入volatile修饰后,线程本地副本的值不在有效,强制线程从堆内存中拿值。

在这里插入图片描述

  1. 防止指令重排
    在JVM执行代码的时候会优化指令,那么就可能打乱原有的执
    行顺序。可能一个值还没有被初始化,另外的线程已经在使用这个值。

atomic原子变量

所有操作都具有原子性的变量。

解决ABA问题

数据被从A修改为B又修改为A,A->B->A。如果一个线程前后两次读取数据,都是A,实际上脏读/多线程安全问题已经发生。

CAS算法,compareAndSwap,对数据的每次操作都记录下时间戳,只有当时间戳和数据一样时,才会进行操作。

和synchronized不同

synchronized也可以实现原子操作, 它是对资源加锁,同一时间内,只有抢占到锁资源的才能操作数据。

synchronized获取锁释放锁需要资源,如果抢占不到还会阻塞。

如果只是针对变量的原子操作,那么就使用原子变量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值