昨天闲着无事,就想看看java并发编程的的一些东西,想到了原子类。遂看。
首先,原子操作指的是在一步之内就完成而且不能被中断。原子操作在多线程环境中是线程安全的,无需考虑同步的问题。
先上一段我经常用来做多线程测试的代码:
public class Test7 {
public static void main(String[] args) {
AtomicLong a = new AtomicLong(0);
int s = 100;
for (int i = 0; i < s; i++) {
new MyThread(a).start();
}
}
}
class MyThread extends Thread{
AtomicLong a = null;
public MyThread(AtomicLong a) {
this.a = a;
}
@Override
public void run() {
System.out.println(a.incrementAndGet());
}
}
运行后可以看到虽然打印出来不是完全从1、2、3....到99,但是没有重复的,说明是有同步了的。它这个同步不用显示编程来控制,原码如下,用到了CAS(比较与交换)算法:
public final long incrementAndGet() {
for (;;) {
long current = get();
long next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
public final boolean compareAndSet(long expect, long update) {
return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
}
来看看大神是怎么说的:
CAS:CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项乐观锁 技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败&#x