如果没有充足的同步,多线程中的操作执行顺序不可预测。
1. 非线程安全的数值序列生成器
// 非线程安全的数值序列生成器
public class UnsafeSequence {
private int value;
public int getNext() {
return value++;
}
public static void main(String[] args) {
UnsafeSequence sequence = new UnsafeSequence();
int num = 10;
Thread one = new Thread(() -> {
int i = 0;
while(i < num) {
System.out.println(Thread.currentThread().getName() + ": " + sequence.getNext());
i++;
}
});
Thread other = new Thread(() -> {
int i = 0;
while(i < num) {
System.out.println(Thread.currentThread().getName() + ": " + sequence.getNext());
i++;
}
});
one.start();
other.start();
}
}
多执行几次,结果会不一样:
Thread-1: 0
Thread-0: 0
Thread-0: 2
Thread-0: 3
Thread-0: 4
Thread-0: 5
Thread-1: 1
Thread-0: 6
Thread-0: 8
Thread-0: 9
Thread-0: 10
Thread-0: 11
Thread-1: 7
Thread-1: 12
Thread-1: 13
Thread-1: 14
Thread-1: 15
Thread-1: 16
Thread-1: 17
Thread-1: 18
2. UnsafeSequence.getNext() 的错误执行情况
A: value->9 ——-> 9+1->10 ——> value=10
B: ——-> value->9 ——> 9+1->10 ——-> value=10
3. 竞态条件 (Race Condition)
在 UnsafeSequence 类中说明的是一种常见的并发安全问题,称为竞态条件(Race Condition)。
在多线程环境下,getValue 是否返回唯一的值,要取决于运行时对线程中操作的交替执行方式,这并不是我们希望看到的情况。
4. 线程安全的数值序列生成器
// 线程安全的数值序列生成器
public class Sequence {
private int value;
// Add synchronized, guarded by 'this'
public synchronized int getNext() {
return value++;
}
}