package com.xue;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author 薛向毅
* @create 2018-06-24 17:28
*
* 一、i++的原子性问题。分为“读-改-写”;
* int i=10;
* i = i++;//10
*
* int temp=i;
* i=i+1;
* i=temp;
* 二、解决办法,CAS算法(compare-And-Swap)
*
**/
public class TestAtomicDemo {
public static void main(String[] args) {
AtomicDemo ad = new AtomicDemo();
for(int i =0;i<10; i++){
new Thread(ad).start();
}
}
}
class AtomicDemo implements Runnable{
// private int serialNumber = 0 ;会出现原子性问题
private AtomicInteger serialNumber = new AtomicInteger();//使用CAS算法
@Override
public void run() {
try {
Thread.sleep(200);
}catch (Exception e){
}
System.out.println(Thread.currentThread().getName()+":"+getSerialNumber());
}
public int getSerialNumber(){
return serialNumber.getAndIncrement();
}
}
二、什么是CAS算法
package com.xue;
/**
* @author 薛向毅
* @create 2018-06-25 16:22
**/
public class TestCompareAndSwap {
public static void main(String[] args) {
final CompareAndSwap cas = new CompareAndSwap();
for (int i = 0; i <10 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int expectedValue = cas.get();
boolean b = cas.compareAndSet(expectedValue,(int)(Math.random()*101));
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;
if(oldValue == expectedValue){
this.value = newValue;
}
return oldValue;
}
//设置
public synchronized boolean compareAndSet(int expectedValue,int newValue){
return expectedValue == compareAndSwap(expectedValue,newValue);
}
}