volatile 使用场景

转自
[url]http://blog.btnotes.com/articles/195.html[/url]

什么是volatile变量

java语言提供了一种削弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。

另外,在旧的内存模型,volatile变量不能被重排序,但它们可能会受到非volatile变量重排序的影响。这破坏了volatile字段做为一个线程到另一个线程的信号条件的有效性。在新的内存模型中volatile变量一样不能被重排序,但将不会受到非volatile变量的影响。

为什么要使用volatile

volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。

应用volatile变量的三个原则

(1)写入变量不依赖此变量的值,或者只有一个线程修改此变量

(2)变量的状态不需要与其它变量共同参与不变约束

(3)访问变量不需要加锁

例1

volatile boolean shutdown;

public void shutdown() {
shutdown = true;
}

public void dowork() {
while (!shutdown) {
// do something
}
}
这是一个适用的场景。

例2

public static int race = 0;

public static void increase() {
race++;
}

public static int getRace() {
return race;
}
这是一个不能用volatile关键字的例子

简单的说

加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值