0

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

4

5 回答 5

4

不管共享资源是共享对象、公共实例变量还是静态内容,所有这些都可能导致竞争条件(也就是说,除非共享资源是不可变的)。

于 2012-07-18T19:39:17.310 回答
3

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

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

于 2012-07-18T19:40:54.920 回答
2

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

于 2012-07-18T19:37:07.047 回答
2

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

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

要解决线程对象实例变量和由线程对象基于每个线程创建的对象的实例成员的多线程问题,您必须更加努力。使用静力学,它自然而然地发生了:)

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

如果你足够努力,你几乎可以搞砸任何事情。

于 2012-07-18T20:52:02.270 回答
0

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

于 2012-07-18T19:42:45.593 回答