您的位置:首页 > 编程语言 > Java开发

java线程--无锁CAS(CompareAndSet比较交换)

2018-01-29 00:00 351 查看

无锁线程安全整数

public class Test {
static AtomicInteger ai = new AtomicInteger(0);
static class MyTask implements Runnable {

@Override
public void run() {
for(int i=0;i<10000;i++){
ai.incrementAndGet();
}

}

}

public static void main(String[] args) throws InterruptedException, ExecutionException {
MyTask t =new MyTask();
//在线程池执行代码,最终未能得到正确答案
//        ExecutorService exs = Executors.newFixedThreadPool(10);
//        for(int i=0;i<10;i++){
//            exs.execute(t);
//        }
//
//        exs.shutdown();
//        System.out.println(ai);

Thread[] ths = new Thread[10];
for(int i =0;i<10;i++){
ths[i] = new Thread(t);
}
for(int i =0;i<10;i++){
ths[i].start();
}
for(int i =0;i<10;i++){
ths[i].join();
}
System.out.println(ai);

}

}

内部实现

public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}

public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

AtomicReference<T> AtomicStampedReference<T>的理解

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: