并发过程中的相互排斥

时间:2012-11-26 22:37:08

标签: java concurrency

例如,我有两个喜欢这个的程序:
共享变量:

boolean f0 = false;
boolean f1 = false;

计划0:

1. f0 = true;
2. while(f1==true){}
3. //Important section
4. f0 = false;

计划1:

a. f1 = true;
b. while(f0==true){}
c. //Important section
d. f1 = false;

我想问的是,是否有这样的情况,两个进程可以同时进入重要部分?你能给我一个特定代码执行的例子吗?
非常感谢你。

5 个答案:

答案 0 :(得分:2)

总之,是的,无数原因(缓存,指令重新排序等)。

答案 1 :(得分:1)

即使只有进程0写入f0,进程1可能正在读取f0而进程0正在写入它,所以你绝对可以在关键部分获得这两个进程。

您需要查找synronized关键字以了解如何安全地处理多个线程。

答案 2 :(得分:0)

是的,这可能发生!

您可以使用

保护该部分
// this Object must be shared between both Threads.
Object lock = new Object();

synronized(lock) {

//  .. here protected

}

答案 3 :(得分:0)

如果这些是真正独立的过程,那么它们的操作完全相互独立,所以答案是'是'。每个都有自己的所有变量的副本。

您是否也想询问线程?无论如何,除非你引入同步机制,否则答案是一样的。

答案 4 :(得分:0)

如果此代码以顺序一致的方式执行,则答案为。没有这样的执行顺序允许这两个线程同时进入临界区。

如果我们考虑Java领域然后是,那就有可能。尽管它们共享一些数据,但您的线程不使用同步。在这种情况下,JVM无法保证他们会相互观察彼此的写入。

但无论如何这个“互斥体”容易陷入僵局。考虑一下这个执行:

f0 = true;
f1 = true;
---------------------
while (f0) {}
while (f1) {}