转自:
下文笔者讲述Atomic相关类实现原理说明,如下所示
Atomic相关开头类的简介说明
JDK Atomic开头的类
其中实现原子性的,都是使用CAS原理解决并发情况下原子性问题
----------------------------------------------------------------------
CAS包含3个参数:
CAS(V, E, N)
-----参数说明------
V:表示需要更新的变量
E:表示变量当前期望值
N:表示更新为的值
当变量V值等于E时,变量V值会被更新为N
当变量V值不等于E,说明变量V值已经被更新过
当前线程什么也不做,返回更新失败
当多个线程同时使用CAS更新一个变量时
此时只有一个线程可以更新成功,其他都失败。
失败的线程不会被挂起,可以继续重试CAS,也可以放弃操作
------------CAS操作原子性的原理-------------------
CAS操作的原子性的原理:
通过CPU单条指令完成而保障
JDK中是通过Unsafe类中API完成
在并发量很高的情况,会有大量CAS更新失败
例:
未使用原子类
package com.java265; public class TestAtomic { private int count = 0; public int getAndIncrement() { return count++; } public static void main(String[] args) { final TestAtomic test = new TestAtomic(); for (int i = 0; i < 3; i++) { new Thread(){ @Override public void run() { for (int j = 0; j < 10; j++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 获取递增值:" + test.getAndIncrement()); } } }.start(); } } }
//使用原子类
package com.java265; import java.util.concurrent.atomic.AtomicInteger; public class TestAtomic { private AtomicInteger count = new AtomicInteger(0); public int getAndIncrement() { return count.getAndIncrement(); } public static void main(String[] args) { final TestAtomic test = new TestAtomic(); for (int i = 0; i < 3; i++) { new Thread(){ @Override public void run() { for (int j = 0; j < 10; j++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 获取递增值:" + test.getAndIncrement()); } } }.start(); } } }