【发布时间】:2011-12-31 02:44:42
【问题描述】:
我有一个方法可以被java程序中的多个线程访问。这个方法有:
- 全局对象变量
- 局部变量
- 形式参数。
现在这个方法是不同步的,所以当多个线程改变上述三种变量的值时,这些变化会反映到其他线程还是每个线程都有这些变量的单独副本。
【问题讨论】:
标签: java multithreading
我有一个方法可以被java程序中的多个线程访问。这个方法有:
现在这个方法是不同步的,所以当多个线程改变上述三种变量的值时,这些变化会反映到其他线程还是每个线程都有这些变量的单独副本。
【问题讨论】:
标签: java multithreading
全局对象:将反映变化
局部变量:不会
形式参数:对象引用会反映变化,原始类型的参数不会反映变化。
【讨论】:
全局对象将被更改, 本地变量不会 如果参数是对象,则可以更改参数,如果它们是整数等原始类型,则不会更改。即使它们是对象,如果每个线程在调用方法之前创建它们并且它们没有被重用,它们也可能不会改变。
但这还不是全部,因为你无法控制执行顺序,即使有一个线程正在处理,它们也会随机变化,所以如果你说一个全局变量 int myVar =0;
方法确实
{ // 第 10 行 我的变量 = 1; // 第 11 行 myVar += 7; // 第 12 行 } // 第 13 行根本无法保证该变量在第 12 行的开头为 1,因为其他线程可能在程序从第 11 行到第 12 行的时间内更改了该值。
归根结底,这是灾难的根源。您需要同步方法或为全局变量和作为参数传递的对象添加锁。
【讨论】:
这里的一些其他答案忘记提到一个非常重要的事实。
对作为参数传递的对象和全局变量的更改与其他线程共享,但是:
如果没有同步,您将永远不知道何时(也许永远不会!)这些更改将显示在其他线程中。 除了同时只允许方法中的一个线程防止 100 种竞争条件之外,进入和退出同步块也将触发所有缓存被清除并在线程/核心之间共享数据。
多线程很难正确处理,请仔细阅读。我推荐 Goetz 的“Java Concurrency in Practice”。
【讨论】: