程序:十个线程去设置值
结果:有的成功有的失败
举例:
①
int expectedValue = compareAndSwap.get();
②
boolean b = compareAndSwap.compareAndSet(expectedValue, (int) (Math.random() * 100));
A 线程执行 ① 获取到了 0,然后B线程获取到时间片,执行 ① ,也获取到了 0。
A获取执行权执行②,A去设置值的时候发现 获取到的 0 和旧的值相同,成功设置值,
然后B去设置值的时候发现 获取到的 0 和旧的值(A设置了值)不相同,此时B什么都不做。
所以FALSE
public class TestCompareAndSwap {
public static void main(String[] args) {
final CompareAndSwap compareAndSwap = new CompareAndSwap();
for (int i = 0; i <10 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
//获取内存值
int expectedValue = compareAndSwap.get();
boolean b = compareAndSwap.compareAndSet(expectedValue, (int) (Math.random() * 100));
System.out.println(b);
}
}).start();
}
}
}
class CompareAndSwap{
private int value;
//获取内存值
public synchronized int get(){
return value;
}
//进行比较
public synchronized int compareAndSwap(int expectedValue, int newValue){
int oldValue = value;
System.out.println("oldValue : "+oldValue+"-----"+"expectedValue : " + expectedValue );
if (oldValue == expectedValue){
this.value = newValue;
}
return oldValue;
}
//设置新值
public synchronized boolean compareAndSet(int expectedValue, int newValue){
return expectedValue == compareAndSwap(expectedValue,newValue);
}
}