例如,我有两个喜欢这个的程序:
共享变量:
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;
我想问的是,是否有这样的情况,两个进程可以同时进入重要部分?你能给我一个特定代码执行的例子吗?
非常感谢你。
答案 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) {}