并发编程——共享模型之无锁

目录

一、并发编程无锁案例

无锁高效率

二、CAS(compareAndSet)

 CAS和volatile的关系

CAS的特点

三、ABA问题 

解决

 四、CAS操作的原子类

 原子整数

 原子引用

 原子数组

字段更新器

原子累加器

五、原子累加器

原子累加器与原子整数的性能比较

六、原子累加器LongAdder原理

LongAdder 类有几个关键域

CAS锁 

伪共享

LongAdder源码

七、Unsafe

 Unsafe的CAS操作实现


一、并发编程无锁案例

interface Account {
// 获取余额
 Integer getBalance();
// 取款
void withdraw(Integer amount);
/**
* 方法内会启动 1000 个线程,每个线程做 -10 元 的操作
* 如果初始余额为 10000 那么正确的结果应当是 0
*/
static void demo(Account account) {
List ts = new ArrayList<>();
long start = System.nanoTime();
for (int i = 0; i < 1000; i++) {
ts.add(new Thread(() -> {
account.withdraw(10);
 }));
 }
//批量启动线程
ts.forEach(Thread::start);

//等待每一个线程执行完
ts.forEach(t -> {
try {
t.join();
 } catch (InterruptedException e) {
e.printStackTrace();
 }
 });

    long end = System.nanoTime();

System.out.println(account.getBalance() + " cost: " + (end-start)/1000_000 + " ms");
 }
}

//实现类
class AccountUnsafe implements Account {
private Integer balance;
public AccountUnsafe(Integer balance) {

    this.balance = balance;
 
}
@Override
public Integer getBalance() {
    return balance;
 }
@Override
public void withdraw(Integer amount) {
balance -= amount;
 }
}

上述案例很明显,withdraw方法是不安全的,以前通常的选择是在withdraw上加synchronized实现对多线程操作共享变量的阻塞,但是现在要引入CAS乐观锁的思路

class AccountSafe implements Account {
    //引用原子整数类
    private AtomicInteger balance;
public AccountSafe(Integer balance) {

你可能感兴趣的:(并发编程,并发编程,高并发编程)