一步一步认识java并发库(一)cas指令

我们将开始一段奇妙的旅程,在这段旅程中我们将解决一个又一个的问题。首先我们来认识一下cas指令。在具体讲述之前,我先提两个问题:
  1. 为什么需要cas指令
  2. 什么是cas指令
  3. 如何用cas指令实现一个简单的锁 
 好,我们正式开始,我们先通过一个例子来回答问题1和2

有一个变量state(初始值为0),有线程thread1执行逻辑,判断state是否是0,是,将state设为1;有线程thread2执行逻辑,判断state是否是0,是,将state设为2。(如图1)
因为是多线程,各个线程间的指令执行顺序不可控,如果是下面的执行顺序,就会带来问题

  指令1(if state==0)->指令3(if state==0)->指令2(state=1)->指令4(state=4)->thread1返回true->thread2返回true

最终state==4,两个线程都返回true,但对于thread1这矛盾了(按thread1的语义,返回true后,state应该为等于2)

 有这个问题怎么办呢?这时候cas指令该上场了,cas(i,a,b)的语义是if (i==a) {i=b;return ture} else return false;并带有原子性(相当于前面的代码语句是一条指令,既,有多个线程执行相同条件的cas(i,a,b)只有一个线程会成功) 

 好,只要将前面的线程代码改成 thread1: return cas(state,0,1);
 thread2: return cas(state,0,2);(如图2)就能解决上面的语义矛盾问题了(因为多个相同条件的cas执行,只有一个会成功)
接下来我们用cas指令来解决问题3
state=0;//0代表未锁住,1代表锁住
public boolen lock(){
     return cas(state,0,1);
}

public boolean unlock(){
     return cas(state,1,0);
}

当然实际的锁,还要解决多次获取,中断响应等,后面我们会具体讲到

posted on 2016-08-01 16:44  superpx  阅读(291)  评论(0)    收藏  举报