volatile域的使用

本文介绍了Java中volatile关键字的作用及使用场景,对比了使用锁与volatile关键字进行并发访问控制的区别。通过具体示例说明了如何利用volatile实现线程间的有效通信。

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

volatile关键字为对一个实例的域的同步访问提供了一个免锁机制。如果你把域声明为volatile,那么编译器和虚拟机就知道该域可能会被另一个线程并发更新

有时候,只是为读写实例的一两个域就使用同步,其带来的开销似乎太大了。这种情况下可以使用volatile关键字


例如,假设一个对象有一个布尔标记,由一个线程设置它的值,而由另一个线程来查询它,那么有以下两个方法

1、使用锁,如下

private boolean done;

public  synchronized boolean isDone(){ return done;}

(这个方法有潜在的隐患:如果另一个线程已经对对象加了锁,isDone方法就会被阻塞)

2、将域声明为volatile

private volatile boolean done;

public boolean isDone(){ return done;}

(当然,访问一个volatile变量比访问一个一般变量要慢,这是为线程安全所付出的代价)


总之,在下面三个条件下,对一个域的并发访问是安全的

(1) 域是 volatile的

(2) 域是final的,并且在构造器调用完成后被访问

(3) 对域的访问有锁保护

网上有一个对volatile的使用总结得还不错

http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值