如果没有充足的同步,多线程中的操作执行顺序不可预测。

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++;
    }
}