由于java 多线程11:volatile关键字该文讲道可以使用不带锁的情况也就是无锁使变量变成可见,这里就理解下如何在无锁的情况对线程变量进行CAS原子性及可见性操作

我们知道,在并发的环境下,要实现数据的一致性,最简单的方式就是加锁,保证同一时刻只有一个线程可以对数据进行操作。。。。例如一个计数器,我们可以用如下的方式来实现:

  1. public class Counter {
  2. private volatile int a = 0;
  3. public synchronized int incrAndGet(int number) {
  4. this.a += number;
  5. return a;
  6. }
  7. public synchronized int get() {
  8. return a;
  9. }
  10. }

?

我们对操作都用synchronized关键字进行修饰,保证对属性a的同步访问。。。这样子确实可以保证在并发环境下a的一致性,但是由于使用了锁,锁的开销,线程的调度等等会使得程序的伸缩性受到了限制,于是就有了很多无锁的实现方式。。。。

其实这些无锁的方法都利用了处理器所提供的一些CAS(compare and switch)指令,这个CAS到底干了啥事情呢,可以用下面这个方法来说明CAS所代表的语义:

  1. public synchronized int compareAndSwap(int expect, int newValue) {
  2. int old = this.a;
  3. if (old == expect) {
  4. this.a = newValue;
  5. }
  6. return old;
  7. }

好吧,通过代码应该对CAS语义的标书很清楚了吧,好像现在大多数的处理器都实现了原子的CAS指令了吧。。

相关文章: