网站建设app开发销售好做吗,孝感高新区建设局网站,免费网页模版下载,海口网站提升排名什么是原子操作不可被中断的一个或者一系列操作实现原子操作的方式Java可以通过锁和循环CAS的方式实现原子操作CAS( Compare And Swap ) 为什么要有CAS#xff1f;Compare And Swap就是比较并且交换的一个原子操作#xff0c;由Cpu在指令级别上进行保证。为什么要有CAS…什么是原子操作不可被中断的一个或者一系列操作实现原子操作的方式Java可以通过锁和循环CAS的方式实现原子操作CAS( Compare And Swap ) 为什么要有CASCompare And Swap就是比较并且交换的一个原子操作由Cpu在指令级别上进行保证。为什么要有CAS因为通过锁实现原子操作时其他线程必须等待已经获得锁的线程运行完以后才能获得资源这样就会占用系统的大量资源CAS包含哪些参数CAS包含三个参数1、变量所在内存地址V2、变量对应的值A3、我们将要修改的值B。如果说V上的变量的值是A的话就用B重新赋值如果不是A那就什么事也不做操作的返回结果原值是多少。循环CAS在一个(死)循环【for(;;)】里不断进行CAS操作直到成功为止(自旋操作即死循环)。CAS实现原子操作的三大问题1、 ABA问题其他的线程把值改成了B很快改成了A原子操作的线程发现值是A就修改这样会有问题。解决ABA引入版本号1A-》2C-》3A2、 循环时间很长的话cpu的负荷比较大3、 对一个变量进行操作可以同时操作多个共享变量有点麻烦CAS线程安全(面试点)通过硬件层面的阻塞实现原子操作的安全原子更新基本类型类AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。AtomicInteger的常用方法如下·int addAndGet(int delta)·boolean compareAndSet(int expectint update)·int getAndIncrement() 原子递增但是返回的是自增以前的值incrementAndGet原子递增但是返回的是自增以后的值·int getAndSet(int newValue)packagecom.lgs.atomicint;importjava.util.concurrent.atomic.AtomicInteger;/*** lgs* 原子操作更新整型*/public classAtomicIntTest {static AtomicInteger ai new AtomicInteger(1);public static voidmain(String[] args) {System.out.println(ai.getAndIncrement());ai.incrementAndGet();System.out.println(ai.get());}}输出13原子更新数组类AtomicIntegerArrayAtomicLongArrayAtomicReferenceArrayAtomicIntegerArray类主要是提供原子的方式更新数组里的整型其常用方法如下。·int addAndGet(int iint delta)·boolean compareAndSet(int iint expectint update)数组通过构造方法传入类会将数组复制一份原数组不会发生变化。packagecom.lgs.atomicarray;importjava.util.concurrent.atomic.AtomicIntegerArray;/*** lgs* 原子操作更新数组*/public classAtomicArray {static int[] value new int[]{1,2};static AtomicIntegerArray ai newAtomicIntegerArray(value);public static voidmain(String[] args) {ai.getAndSet(0,3);System.out.println(ai.get(0));System.out.println(value[0]);}}输出31原子更新引用类型提供的类。·AtomicReference 可以解决更新多个变量的问题·AtomicStampedReference解决ABA问题 使用数字作为版本 关心得是有几个人改过·AtomicMarkableReference解决ABA问题 使用Boolean作为版本关心的是有没有修改过packagecom.lgs;importjava.util.concurrent.atomic.AtomicReference;/*** lgs* 原子操作更新引用类型即可以同时更新多个值*/public classAtomicRef {static AtomicReference userAtomicReference new AtomicReference();public static voidmain(String[] args) {User user new User(lgs,26);userAtomicReference.set(user);User updateUser new User(ll,27);userAtomicReference.compareAndSet(user,updateUser);System.out.println(userAtomicReference.get().getName());System.out.println(userAtomicReference.get().getOld());}static classUser{privateString name;private intold;public User(String name, intold) {this.name name;this.old old;}publicString getName() {returnname;}public intgetOld() {returnold;}}}输出ll27原子更新字段类Atomic包提供了以下3个类进行原子字段更新。·AtomicReferenceFieldUpdater·AtomicIntegerFieldUpdater·AtomicLongFieldUpdater违反了面向对象的原则一般不使用