多线程进阶之CAS等

(接我之前的那条)
二、CAS(compare and swap)
操作系统/硬件设备 赋予应用程序的一种原子操作的力量源泉之一。
判断某个变量的值,如果这个值和你猜的值一样,就交换值。如果这个值猜的不一样就无事发生。(硬件实现的原子操作)。
CAS 的典型应用场景:
无锁编程。保证线程安全。
加锁操作开销比较大,及时 Sychronized 内置了很多的优化策略。还是比较大。要想要更加灵活,更加高效的完成,就可以使用 CAS。
例如,想要完成一个线程安全的 i++ 这样操作:
void add(){
// 相关让 i 进行 ++
int oldValue = i;
while(!CAS( &i, oldValue, oldValue+1)){
oldValue = i;
}
}
这样的diamante就可以保证多线程并发调用 add,对于 i 的修改仍然是线程安全的。
i ++多线程同时进行的时候,涉及到先读内容,再修改赋值(read and update)使用CAS就能保证多线程进行 i++ 操作时候仍然是安全的。CAS 相当于把读取判断操作和修改操作做成一个原子操作。
注意一点:CAS 是原子的,哪怕多线程并发执行也是一个线程执行完了,再执行另一个线程的。
上面代码的本质就在于,通过 CAS 验证看当前的 i 的值是否有人再改。如果没有人改,自己就该,如果有人改,自己就等会再改(此处等会,不是挂起等待,而是while 循环会快速的再次执行到 CAS 操作的)

JVM内部使用CAS 完成了很多功能。
1.原子类。
int ,long 内置类型,++/-- 等操作(本质上就是对 CAS 进行了封装)
多线程进阶之CAS等_第1张图片
2.就可以在 用户态实现轻量级锁/自旋锁

class Locker {
   
    Thread owner - null; // 表示那个线程持有锁
    
    void lock() {
   
        if(CAS(&owner,null,

你可能感兴趣的:(并发编程,jvm,编程语言)