本文目录
1 Compare And Swap(CAS)
2 Atomic
1 Compare And Swap(CAS)
CAS是一种无锁的非阻塞算法。
CAS是一种乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个可以更新变量的值,其它线程都将失败,并继续尝试更新。
在CAS中有3个操作数:内存值V,预期旧值A,新值B。
当且仅当预期旧值A与内存值V相等时,才将内存值V修改为B,否则,失败。
简单示例:
(1) 获得旧的值A:int a =get();
(2) 计算新的值B:int b = a +1;
(3) 写入新的值B:set(a, b);
说明:
在设置新值的时候,给出预期旧值A;
若此时,内存值与预期旧值A相同,则说明期间未有其它线程修改过该值,无冲突,可写入新值B;
若此时,内存值与预期旧值A不同,则说明期间有其它线程修改过该值,有冲突,基于旧值a计算得到的新值b已经无效。
2 Atomic
为了避免使用synchronized关键字(会降低性能),Java提供了实现CAS技术的类,可以在非激烈竞争的情况下,以更小的开销及更高的性能,使一些操作具备线程安全性。
java.util.concurrent.atomic中的常用类:
AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference<V>等。
2.1 AtomicInteger类
import java.util.concurrent.atomic.AtomicInteger;
public classCounter {
public volatile static AtomicInteger atoInt = new AtomicInteger(0);
public static void increase() {
atoInt.incrementAndGet();
}
public static void decrease() {
atoInt.decrementAndGet();
}
public static int get() {
return atoInt.get();
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
Counter.increase();
}
}).start();
}
Thread.sleep(1000);
// 由于线程安全, 每次结果都为1000.
System.out.println("Result = "+ Counter.get());
}
}