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();
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


