导航
-
-
- 一. 非原子操作
- 二. 原子操作
-
- 1. 使用锁
- 2. 使用原子类
-
一. 非原子操作
首先在并发场景中, 一个线程需要对内存中的某个共享变量的值进行修改时,大致可分为以下三个步骤:
# 1.从内存中读取共享变量的值,到线程本地
# 2.执行修改操作
# 3.将修改后的新值,重新写回到内存中
此时,如果有其他线程也执行对该共享变量的值进行修改操作, 那么上述的三个步骤,就会受到其他线程的干扰,最终内存中的共享变量值可能就不是期望的结果。
举个例子: 创建10个线程,模拟并发场景,每个线程执行100次自增
public class NoAtomicOperationExample {
private static Integer VALUE = 0;
private static void add() {
VALUE++;
}
public static void main(String[] args) {
//创建10个线程,模拟并发创建,每个线程执行100次自增
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 1; j <= 100; j++) {
add();
}
}).start();
}
//保证所有线程都执行完
try {
Thread.sleep(2000);