关于Java中的volatile变量

在Java里进行线程同步,常用synchronized加锁机制,也可用volatile标示变量。指明变量为volatile,编译器不会对其操作重排序和缓存到寄存器,读写操作线程安全且不阻塞线程。但对变量进行读取、写入和修改组合操作时,volatile无法保证线程安全,需用AtomicXXX变量或加锁机制。

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

在Java中进行线程同步,一般使用的是synchronized加锁机制,但是有时候对某些变量可以采用volatile标示达到线程同步的效果。

当把一个变量指明为volatile时,实际上告诉编译器,这个变量是会被多线程访问的。因此编译器将不会做下面两种操作:

1、不会将该变量上的操作与其他内存操作重排序;

2、不会将该变量缓存到寄存器。

这样做的结果导致对该变量的读取写入这两种操作一定是线程安全的,而且不会像加锁一样阻塞线程,所以比synchronized机制要好。

volatile变量使用时容易出错的地方是:如果对变量的操作是读取、写入和修改的某种组合操作时,比如常见的a++,volatile是无法保证这种组合操作的线程安全性的。这个时候就不能用volatile了,而应该用AtomicXXX变量或者加锁机制了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值