JDK中Atomic相关类的实现原理简介说明
下文笔者讲述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(); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。