目录
?
不可分割的,且一个操作是不可中断的,即便是多线程的情况下也可以保证
原子类的作用和锁类似,是为了保证并发情况下线程安全,不过原子类相比于锁,有一定的优势
粒度更细:原子变量可以把竞争范围缩小到变量级别,这是我们可以获得的最细粒度的情况了,通常锁的力度都要大于原子变量的粒度
效率更高:通常,使用原子类的效率会比使用锁的效率更高,除了高度竞争的情况
Atomic* ?基本类型原子类 | ? ? ?AtomicInteger ? ? ?AtomicLong ? ? ?AtomicBoolean |
Atomic*Array ?数组类型原子类?? | ? ? ?AtomicIntegerArray ? ? ?AtomicLongArray ? ? ?AtomicBooleanArray |
Atomic*Reference ?引用类型原子类? | ? ? ?AtomicReference ? ? ?AtomicStampedReference ? ? ?AtomicMarkableReference |
Atomic*FieldUpdater ?升级类型原子类 | ? ? ?AtomicIntegerFieldUpdater ? ? ?AtomicLongFieldUpdater ? ? ?AtomicReferenceFieldUpdater |
Adder累加器 | ? ? ?LongAdder ? DoubleAdder |
Accumulator累加器 | ? ? ?LongAccumulator ? ? ? ? DoubleAccumulator |
/**
* 描述:演示AtomicInteger的基本用法,对比非原子类的线程安全问题
* 使用了原子类之后,不需要加锁,也可以保证线程安全问题
*/
public class AtomicIntegerDemo implements Runnable{
public static final AtomicInteger atomicInteger = new AtomicInteger();
public void incrementAtomic(){
atomicInteger.getAndIncrement();
}
public static volatile int basicCount = 0;
public void incrementBasic(){
basicCount++;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
incrementAtomic();
incrementBasic();
}
}
public static void main(String[] args) throws InterruptedException {
AtomicIntegerDemo r = new AtomicIntegerDemo();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("原子类的结果:"+atomicInteger.get());
System.out.println("普通的结果:"+basicCount);
}
}
执行结果:
原子类的结果:20000
普通的结果:19980
/**
* 描述:演示原子数组使用
*/
class AtomicArrayDemo{
public static void main(String[] args) {
AtomicIntegerArray atomicIntegerArray = new AtomicIntegerArray(1000);
Incrementer incrementer = new Incrementer(atomicIntegerArray);
Decrementer decrementer = new Decrementer(atomicIntegerArray);
Thread[] threadsIncrementer = new Thread[100];
Thread[] threadsDecrementer = new Thread[100];
for (int i = 0; i < 100; i++) {
threadsDecrementer[i] = new Thread(decrementer);
threadsIncrementer[i] = new Thread(incrementer);
threadsDecrementer[i].start();
threadsIncrementer[i].start();
}
for (int i = 0; i < 100; i++) {
try {
threadsDecrementer[i].join();
threadsIncrementer[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < atomicIntegerArray.length(); i++) {
if (atomicIntegerArray.get(i) != 0){
System.out.println("发现了错误"+i);
}
}
System.out.println("运行结束");
}
}
class Decrementer implements Runnable{
private AtomicIntegerArray array;
public Decrementer(AtomicIntegerArray array) {
this.array = array;
}
@Override
public void run() {
for (int i = 0; i < array.length(); i++) {
array.getAndDecrement(i);
}
}
}
class Incrementer implements Runnable{
private AtomicIntegerArray array;
public Incrementer(AtomicIntegerArray array) {
this.array = array;
}
@Override
public void run() {
for (int i = 0; i < array.length(); i++) {
array.getAndIncrement(i);
}
}
}
AtomicReference: AtomicReference类的作用和AtomicInteger并没有本质区别,AtomicInteger可以让一个整数保证原子性,而AtomicReference可以让一个对象保证原子性
上一篇的自旋锁演示就是通过它实现的
上篇文章给大家介绍了 Java正则表达式匹配,替换,查找,切割的方法 ,接下来,...
Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特...
本文实例讲述了Laravel框架源码解析之反射的使用。分享给大家供大家参考,具体如...
4月11日20:30~22:00通过腾讯会议进行了第二次在线学习讨论我把学习笔记整理一下...
复制代码 代码如下: % URL="http://news.163.com/special/00011K6L/rss_newstop....
错误描述: 在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报...
DELETEFROMTablesWHEREIDNOTIN(SELECTMin(ID)FROMTablesGROUPBYName) Min的话保...
工具:Eclipse,Oracle,smartupload.jar;语言:jsp,Java;数据存储:Oracle。...
正则忽略大小写 – RegexOptions.IgnoreCase 例如: 复制代码 代码如下: Str = R...
项目中用到的一些特殊字符和图标 html代码 XML/HTML Code 复制内容到剪贴板 div ...