Java自学-多线程|Java自学-多线程 原子访问
多线程 原子访问
步骤 1 : 原子性操作概念
【Java自学-多线程|Java自学-多线程 原子访问】所谓的原子性操作即不可中断的操作,比如赋值操作
int i = 5;
原子性操作本身是线程安全的
但是 i++ 这个行为,事实上是有3个原子性操作组成的。
步骤 1. 取 i 的值
步骤 2. i + 1
步骤 3. 把新的值赋予i
这三个步骤,每一步都是一个原子操作,但是合在一起,就不是原子操作。就不是线程安全的。
换句话说,一个线程在步骤1 取i 的值结束后,还没有来得及进行步骤2,另一个线程也可以取 i的值了。
这也是分析同步问题产生的原因 中的原理。
i++ ,i--, i = i+1 这些都是非原子性操作。
只有int i = 1,这个赋值操作是原子性的。
步骤 2 : AtomicInteger
JDK6 以后,新增加了一个包java.util.concurrent.atomic,里面有各种原子类,比如AtomicInteger。
而AtomicInteger提供了各种自增,自减等方法,这些方法都是原子性的。 换句话说,自增方法 incrementAndGet 是线程安全的,同一个时间,只有一个线程可以调用这个方法。
package multiplethread;
import java.util.concurrent.atomic.AtomicInteger;
public class TestThread {public static void main(String[] args) throws InterruptedException {
AtomicInteger atomicI =new AtomicInteger();
int i = atomicI.decrementAndGet();
int j = atomicI.incrementAndGet();
int k = atomicI.addAndGet(3);
}}
步骤 3 : 同步测试
分别使用基本变量的非原子性的++运算符和 原子性的AtomicInteger对象的 incrementAndGet 来进行多线程测试。
测试结果如图所示
文章图片
package multiplethread;
import java.util.concurrent.atomic.AtomicInteger;
public class TestThread {private static int value = https://www.it610.com/article/0;
private static AtomicInteger atomicValue =new AtomicInteger();
public static void main(String[] args) {
int number = 100000;
Thread[] ts1 = new Thread[number];
for (int i = 0;
i < number;
i++) {
Thread t =new Thread(){
public void run(){
value++;
}
};
t.start();
ts1[i] = t;
}//等待这些线程全部结束
for (Thread t : ts1) {
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}System.out.printf("%d个线程进行value++后,value的值变成:%d%n", number,value);
Thread[] ts2 = new Thread[number];
for (int i = 0;
i < number;
i++) {
Thread t =new Thread(){
public void run(){
atomicValue.incrementAndGet();
}
};
t.start();
ts2[i] = t;
}//等待这些线程全部结束
for (Thread t : ts2) {
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.printf("%d个线程进行atomicValue.incrementAndGet();
后,atomicValue的值变成:%d%n", number,atomicValue.intValue());
}}
更多内容,点击了解: 多线程 原子访问
推荐阅读
- Java技术:Gif编码器(gifencoder)的实际应用(1)
- .NET 异步详解
- java开发|SpringBoot 整合 Redis 短信验证码登录
- java|SpringBoot整合腾讯云短信服务实现发送短信功能(一篇就够了)
- 路痴不易,请多关照
- 李希贵(希望学校没多少特色,但每一位学生都有自己的个性)
- javascript|vue实现HTML转PDF (已解决清晰、页边距、图片导出等问题)
- 免费的东西最贵
- java基础|TCC分布式事务——设计思想及其可能遇到的问题
- java基础|mq消息积压怎么对应