Quantcast
Channel: 蜗牛都知道
Viewing all articles
Browse latest Browse all 105

关于volatile

$
0
0

来源:Java并发编程实践

访问volatile变量的操作不会加锁,也就不会引起执行线程的阻塞,这使得volatile变量相对于synchronized而言,只是轻量级的同步机制。volatile变量固然方便,但也存在限制。它们通常被当做标识完成、中断、状态的标记使用,如下的asleep标记。

volatile boolean asleep;
...
    while (!asleep)
        countSomeSheep();

尽管volatile也可以用来标示其他类型的状态信息,但是决定这样做之前应该格外小心。比如,volatile的语义不足以使自增操作(count++)原子化,除非你能保证只有一个线程对变量执行写操作。加锁可以保证可见性和原子性;volatile变量只能保证可见性。

只有满足了下面的标准后,你才能是使用volatile变量:
1、写入变量时并不依赖变量的当前值;或者能够确保只有单一的线程修改变量的值;
2、变量不需要与其他状态变量共同参与不变约束;
3、访问变量时,没有其他原因需要加锁。


Viewing all articles
Browse latest Browse all 105

Trending Articles