变量范围如何影响多线程竞争条件?

时间:2012-07-18 19:35:53

标签: java multithreading thread-safety

实例变量是否也像静态变量一样共享?这是否意味着竞争条件仅由于静态和实例变量而发生?

5 个答案:

答案 0 :(得分:4)

如果共享资源是共享对象,公共实例变量或静态内容,则所有这些都可能导致race-condition(即除非共享资源为immutable)。< / p>

答案 1 :(得分:3)

是实例变量也是共享的,如果多个线程有权访问该实例,则可能需要防止过时读取或多部分写入可能破坏对象的状态。

此外,访问文件系统上的文件等外部资源可能会导致竞争条件。

答案 2 :(得分:2)

Runnable / Thread对象的实例变量在线程之间共享(如果多个线程在同一个对象上工作),并且不保证线程执行的顺序或顺序,这可能导致不一致的结果。

答案 3 :(得分:2)

  

实例变量是否也像静态变量一样共享?

不,它们是每个对象,而静态是每个类。您应该对线程对象的数据成员没有直接的问题 - 就像任何其他对象一样,每个实例都有自己的变量。同样,当然,基于堆栈的自动变量。

要在每个线程的基础上进入线程对象实例变量和线程对象创建的对象的实例成员的多线程问题,你必须更加努力。随着静态,它自然发生:)

  

这是否意味着仅因静态和实例变量而发生竞争条件?

如果你努力尝试,几乎可以搞砸任何东西。

答案 4 :(得分:0)

如果没有特定的构造来创建线程局部上下文,默认情况下,保持状态的任何内容都是线程安全的。它不仅仅是Runnable的实例,代码可以触摸并且无法锁定的任何内容都是未定义行为的潜在来源(不仅仅是竞争条件,还有其他不可预测的部分更新结果会使您的应用程序状态同样受到损害)。 p>

相关问题