# 共享模型管程
两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?
static int counter = 0; | |
public static void main(String[] args) throws InterruptedException { | |
Thread t1 = new Thread(() -> { | |
for (int i = 0; i < 5000; i++) { | |
counter++; | |
} | |
}, "t1"); | |
Thread t2 = new Thread(() -> { | |
for (int i = 0; i < 5000; i++) { | |
counter--; | |
} | |
}, "t2"); | |
t1.start(); | |
t2.start(); | |
t1.join(); | |
t2.join(); | |
log.debug("{}",counter); | |
} |
临界区 Critical Section
一个程序运行多个线程本身是没有问题的
问题出在多个线程访问共享资源
多个线程读共享资源其实也没有问题
在多个线程对共享资源读写操作时发生指令交错,就会出现问题
一段代码块内如果存在对共享资源的多线程读写操作,称这段代码块为临界区
例如,下面代码中的临界区
static int counter = 0; | |
static void increment() | |
// 临界区 | |
{ | |
counter++; | |
} | |
static void decrement() | |
// 临界区 | |
{ | |
counter--; | |
} |
竞态条件 Race Condition
多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件