Semaphore s = new Semaphore (0);
int x = 7;
int y = 1;
1.1 s.acquire(); 2.1 s.release();
2.2. s.release();
1.2 s.aquire(); 2.3 s.acquire();
1.3 int tmp = x; 2.4 int tmp = y;
1.4 s.release(); 2.5 s.release();
1.5. tmp = tmp * 2; 2.6 tmp = tmp * 3;
1.6. s.acquire(); 2.7 s.acquire();
1.7 y = tmp + 1; 2.8 x = tmp + 1;
1.8. s.release(); 2.9 s.release();
如果这两个线程并行运行,我很难得到这些变量x和y的结果。
信号量有0个许可证?所以这里唯一可能的输出应该是x = 7,y = 1,不应该吗?
我不了解嵌套的acquire()和releases()。 x和y的结果是ifsemaphore会有2个许可证?
答案 0 :(得分:0)
由于代码没有延迟,它可以以多种方式运行,具体取决于哪个CPU更快,或者OS如何调度线程(例如,在单CPU系统中):
2.1 s.release(); 1 permit
2.2 s.release(); 2 permits
1.1 s.acquire(); 1 permit
1.2 s.acquire(); 0 permits
1.3 int tmp = x;
1.4 s.release(); 1 permit
1.5 tmp = tmp * 2;
1.6 s.acquire(); 0 permits
1.7 y = tmp + 1;
1.8 s.release(); 1 permit
2.3 s.acquire(); 0 permits
2.4 int tmp = y;
2.5 s.release(); 1 permit
2.6 tmp = tmp * 3;
2.7 s.acquire(); 0 permits
2.8 x = tmp + 1;
2.9 s.release(); 1 permit
或者:
2.1 s.release(); 1 permit
2.2 s.release(); 2 permits
2.3 s.acquire(); 1 permit
2.4 int tmp = y;
2.5 s.release(); 2 permits
2.6 tmp = tmp * 3;
2.7 s.acquire(); 1 permit
2.8 x = tmp + 1;
2.9 s.release(); 2 permits
1.1 s.acquire(); 1 permit
1.2 s.acquire(); 0 permits
1.3 int tmp = x;
1.4 s.release(); 1 permit
1.5 tmp = tmp * 2;
1.6 s.acquire(); 0 permits
1.7 y = tmp + 1;
1.8 s.release(); 1 permit
不能发生的是,步骤1.3和2.4并行运行。没有足够的许可证。
2.1 s.release(); 1 permit
1.1 s.acquire(); 0 permits
2.2 s.release(); 1 permit
1.2 s.acquire(); 0 permits
1.3 int tmp = x; <blocked>
1.4 s.release(); <blocked> 1 permit
2.3 s.acquire(); 0 permits
2.4 int tmp = y;
2.5 s.release(); 1 permit
1.5 tmp = tmp * 2; 2.6 tmp = tmp * 3;
2.7 s.acquire(); 0 permits
<blocked> 2.8 x = tmp + 1;
<blocked> 2.9 s.release(); 1 permit
1.6 s.acquire(); 0 permits
1.7 y = tmp + 1;
1.8 s.release(); 1 permit
这两个线程可以通过许多其他方式进行交错。