网站怎么做下载网页代码吗,全国连锁十强婚纱摄影,矿业公司网站源码,wordpress 同步微博CAS
在高并发场景#xff0c;可以使用加锁、CAS来保证原子性#xff0c;但是加锁是很重量级的操作#xff0c;CAS类似于乐观锁CAS #xff08; Compare and swap #xff09;比较并交换#xff0c;是实现并发算法时常用到的技术#xff0c;包含三个操作数#xff1a;内…CAS
在高并发场景可以使用加锁、CAS来保证原子性但是加锁是很重量级的操作CAS类似于乐观锁CAS Compare and swap 比较并交换是实现并发算法时常用到的技术包含三个操作数内存位置、预期原值、更新值执行CAS操作的时候将内存位置中的值与预期原值比较 如果匹配会将该位置的值更新为新值如果不匹配就不会做任何操作或者重试这种重试被称为自旋多个线程同时执行CAS操作只有一个会成功 CAS 是JDK提供的非阻塞原子操作通过硬件保证了比较-更新的原子性CAS 是一种系统原语原语属于操作系统用于范畴由若干条指令组成用于完成某个功能原语的执行必须是连续的在执行过程中不允许被中断所以说CAS是一条CPU的原子指令不会造成数据不一致的问题JDK提供的CAS机制在汇编层级会禁止变量两侧的指令优化然后使用 cmpxchg比较并交换 指令比较并更新变量值执行 cmpxchg 指令的时候会判断当前系统是否为多核系统 如果是就给总线加锁只有一个线程可以对总线加锁成功加锁成功后执行CAS操作所以CAS的原子性实际上是CPU实现独占的比起synchronizedCAS的排他时间要短很多多线程情况下性能会更好
CAS自旋锁
CAS利用CPU的指令保证了操作的原子性达到锁的效果自旋锁也就是获取锁失败的线程不会立即阻塞而是采用循环的方式去尝试获取锁直到成功获取锁或者超时放在CAS就是执行一个CAS操作不断的去执行CAS操作直到CAS操作被成功执行这样的好处是减少了线程上下文的切换缺点是循环会消耗CPU
示例不通过 synchronized 和 lock 就实现了锁的功能
public class Caslock {//是否加锁,初始值为 false也就是未加锁private AtomicBoolean atomicBoolean new AtomicBoolean(false);public void lock(){System.out.println(Thread.currentThread().getName(),尝试加锁);//原子布尔的值是否是false是就加锁把值改为true不是就释放锁while (!atomicBoolean.compareAndSet(false,true)){//不是false加锁失败由其他线程先加了锁这里就需要等待try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(Thread.currentThread().getName(),加锁成功);}public void unLock(){//解锁把值设为 falseatomicBoolean.compareAndSet(true,false);System.out.println(Thread.currentThread().getName(),释放锁);}
}private static void testCasLock() throws Exception{Caslock caslock new Caslock();new Thread(()-{caslock.lock();try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}caslock.unLock();},线程A).start();Thread.sleep(500);new Thread(()-{caslock.lock();caslock.unLock();},线程B).start();}-- 执行结果是线程A,尝试加锁
线程A,加锁成功
线程B,尝试加锁
线程A,释放锁
线程B,加锁成功
线程B,释放锁