像这种情况,及多个进程并发访问和操作同一数据且执行结果与访问发生的特定顺序有关,称为竞争条件。
为了避免上述情况的发生于是就引入了临界区概念。一个系统有n个进程,每个进程有一个代码段称为临界区。这种系统重要特征是当一个进程在临界区内执行,没有其他进程被允许在临界区内执行。
临界区问题必须满足三项原则:互斥,前进,有限等待。
了解了临界区之后,那么如何控制两个进程访问一个共享的单位用户资源而不发生访问冲突。Peterson算法是一个实现互斥所的并发程序设计算法,它很好地解决了这个问题。
- public class Peterson implements Runnable {
-
- private static boolean[] in = { false, false };
- private static volatile int turn = -1;
-
- public static void main(String[] args) {
- new Thread(new Peterson(0), "Thread - 0").start();
- new Thread(new Peterson(1), "Thread - 1").start();
- }
-
- private final int id;
-
- public Peterson(int i) {
- id = i;
- }
-
- private int other() {
- return id == 0 ? 1 : 0;
- }
-
- @Override
- public void run() {
- in[id] = true;
- turn = other();
- while (in[other()] && turn == other()) {
- System.out.println("[" + id + "] - Waiting...");
- }
- System.out.println("[" + id + "] - Working ("
- + ((!in[other()]) ? "other done" : "my turn") + ")");
- in[id] = false;
- }}