又加入了version,防止多次修改后,期望值和多次修改后的值相同,被误判为无修改。
出现修改失败的原因:
线程1执行getV,getversion后,线程2执行getv,getversion,线程1在执行修改,修改成功,v(也可能多次修改后值相同)和version均改变,线程2执行修改方法,返回flase
线程1getV,线程二执行完三个方法,线程1执行getversion,出现v未改变,version改变了
所以两周要同时要求相同
package week3.day13;
import java.util.Random;
/**
* 2020/8/6
* 12:23
* zmx
*/
public class TestCas {
public static void main(String[] args) {
Cas cas=new Cas();
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for(;;) {//无线循环,保证都能修改成功
int e=cas.getV();
int version=cas.getVersion();
boolean b=cas.compareandswap(e,new Random().nextInt(100),version);
if(b){
System.out.println("修改成功"+Thread.currentThread().getName());
break;
}else {
System.out.println("修改失败"+ Thread.currentThread().getName());
}
}
}
}).start();
}
}
}
class Cas{
private int v;
private int version;
public synchronized int getV() {
return v;
}
public synchronized int getVersion() {
return version;
}
public synchronized boolean compareandswap(int e,int n,int version){
if(e==v&&this.version==version){//比较期望值与要更新的变量+版本
this.version++;
this.v=n;
return true;
}
return false;
}
}