做一个这样的网站应该报价多少,苏州建设职业培训中心,豪华网站建设,专门做网站网站犯法吗AtomicInteger原理
4.6.1 原理介绍
AtomicInteger的本质#xff1a;自旋锁 CAS算法
CAS的全成是#xff1a; Compare And Swap(比较再交换); 是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-write转换为原子操作#xff0c;这…AtomicInteger原理
4.6.1 原理介绍
AtomicInteger的本质自旋锁 CAS算法
CAS的全成是 Compare And Swap(比较再交换); 是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-write转换为原子操作这个原子操作
直接由处理器保证。CAS有3个操作数内存值V旧的预期值A要修改的新值B。当且仅当旧预期值A和内存值V相同时将内存值V修改为B并返回true否则什么都不做并返回false。
举例说明 在内存值V当中存储着值为10的变量。 此时线程1想要把变量的值增加1。对线程1来说旧的预期值 A 10 要修改的新值 B 11。 在线程1要提交更新之前另一个线程2抢先一步把内存值V中的变量值率先更新成了11。 线程1开始提交更新首先进行A和内存值V的实际值比较Compare发现A不等于V的值提交失败。 线程1重新获取内存值V作为当前A的值并重新计算想要修改的新值。此时对线程1来说A 11B 12。这个重新尝试的过程被称为自旋。 这一次比较幸运没有其他线程改变V的值。线程1进行Compare发现A和V的值是相等的。 线程1进行SWAP把内存V的值替换为B也就是12。 举例说明这好比春节的时候抢火车票下手快的会抢先买到票而下手慢的可以再次尝试直到买到票。
4.6.2 源码分析
那么接下来我们就来查看一下AtomicInteger类中incrementAndGet方法的源码。
public class AtomicInteger extends Number implements java.io.Serializable {// cas算法的实现类private static final jdk.internal.misc.Unsafe U jdk.internal.misc.Unsafe.getUnsafe();// 表示变量值在内存中的偏移量地址unsafe类就是根据内存偏移量地址获取数据值。private static final long VALUE U.objectFieldOffset(AtomicInteger.class, value);private volatile int value;// 以原子方式将当前值加1这里返回的是自增后的值public final int incrementAndGet() {/* this表示当前AtomicInteger对象 1表示要增加的值 */return U.getAndAddInt(this, VALUE, 1) 1; // 调用Unsafe类中的getAndAddInt方法}}UnSafe类
public final class Unsafe {// Unsafe类中的getAndAddInt方法public final int getAndAddInt(Object o, long offset, int delta) {int v;// do...while就是自旋操作,当CAS成功以后循环结束do {// 获取AtomicInteger类中所封装的int类型的值就相当于旧的预期值Av getIntVolatile(o, offset); // 调用本类的weakCompareAndSetInt方法实现比较在交换 o: AtomicInteger对象, v: 相当于旧的预期值A, v delta新值B} while (!weakCompareAndSetInt(o, offset, v, v delta));return v;}// Unsafe类中的weakCompareAndSetInt方法public final boolean weakCompareAndSetInt(Object o, long offset, int expected, int x) {return compareAndSetInt(o, offset, expected, x);}// 本地方法调用CPU指令实现CASpublic final native boolean compareAndSetInt(Object o, long offset, int expected, int x);}4.7 CAS与Synchronized
CAS和Synchronized都可以保证多线程环境下共享数据的安全性。那么他们两者有什么区别
Synchronized是从悲观的角度出发
总是假设最坏的情况每次去拿数据的时候都认为别人会修改所以每次在拿数据的时候都会上锁这样别人想拿这个数据就会阻塞直到它拿到锁共享资源每次只给一个线程使用其它线
程阻塞用完后再把资源转让给其它线程。因此Synchronized我们也将其称之为悲观锁。jdk中的ReentrantLock也是一种悲观锁。
CAS是从乐观的角度出发:
总是假设最好的情况每次去拿数据的时候都认为别人不会修改所以不会上锁但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。CAS这种机制我们也可以将其称之为乐观锁。