1.问题提出
有如下需求,保证account.withdraw取款方法的线程安全
public class TestAccount{
public static void main(String[] args) {
Account account = new AccountUnsafa(10000);
Account.demo(account);
Account account2 = new AccountCas(10000);
Account.demo(account2);
}
}
/**
* 保护共享资源--无锁实现
* @author shm
* @date 2020/9/26
*/
class AccountCas implements Account{
private AtomicInteger balance;
public AccountCas(int balance) {
this.balance = new AtomicInteger(balance);
}
@Override
public Integer getBalance() {
return balance.get();
}
@Override
public void withdraw(Integer amounnt) {
while (true){
//获取余额的最新值
int prew = balance.get();
//要修改的余额
int next = prew - amounnt;
//真正修改 (即同步到主存)
if (balance.compareAndSet(prew,next)){
break;
}
}
}
}
/**
* 保护共享资源--有锁实现
* @author shm
* @date 2020/9/26
*/
class AccountUnsafa implements Account{
private Integer balance;
public AccountUnsafa(Integer balance) {
this.balance = balance;
}
@Override
public Integer getBalance() {
synchronized (this) {
return this.balance;
}
}
@Override
public void withdraw(Integer amounnt) {
synchronized (this) {
this.balance -= amounnt;
}
}
}
interface Account {
//获取余额
Integer getBalance();
//取款
void withdraw(Integer amounnt);
/**
* 方法内会启动1000个线程,每个线程做 -10 元的操作
* 如果初始余额为10000 那么正确的结果应该是0
* @param account dsf
* @return void
* @author shm
* @date 2020/9/26
*/
static void demo(Account account){
List<Thread> ts = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
ts.add(new Thread(()->{
account.withdraw(10);
}));
}
long start = System.nanoTime();
ts.forEach(Thread::start);
ts.forEach(thread -> {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
long end = System.nanoTime();
System.out.println(account.getBalance()+",cost:"+(end-start)/1000_000+"ms");
}
}
2.CAS与volatile
2.1 CAS工作方式
其中的关键是compareAndSet,它的简称就是CAS(也有Compare And Swap的说法),它必须是原子操作。
2.2 volatile
2.3 无锁效率分析
2.4 CAS的特点
3 原子整数
J.U.C (java.util.concurrent)并发包提供了:
以AtomicInteger为例
updateAndSet原理
4.原子引用
4.1 AtomicReference
-
可以原子更新的对象引用。
4.2 ABA问题
4.3 AtomicStampedReference
4.4 AtomicMarkableReference
5. 原子数组
申明:内容来自网络,仅供学习使用
https://www.bilibili.com/video/BV1jE411j7uX