多个线程访问的方法相同

时间:2011-11-17 07:52:58

标签: java multithreading

我有一个方法可以被java程序中的多个线程访问。这个方法有:

  1. 全局对象变量
  2. 本地变量
  3. 形式参数。
  4. 现在这个方法不同步,所以当多个线程更改上述三种类型变量的值时,这些更改会反映在其他线程中,或者每个线程都会有这些变量的单独副本。

3 个答案:

答案 0 :(得分:2)

全局对象:将反映更改

本地变量:不会

形式参数:对象引用将反映基本类型的更改和参数不会反映更改。

答案 1 :(得分:2)

这里的其他一些答案忘了提到一个非常重要的事实。

对作为参数传递的对象的更改和全局变量与其他线程共享,但是:

如果没有同步,你永远不会知道何时(可能永远不会!)这些更改将在其他线程中显示。除了在方法中只允许一个线程同时防止100种风格的竞争条件,进入和退出同步块也将触发清除所有高速缓存并在线程/核心之间共享数据。

多线程很难做到正确,仔细阅读。我推荐Goetz的“Java Concurrency in Practice”。

答案 2 :(得分:0)

Golbal对象将被改变, 本地变量不会 如果它们是对象,则可以更改参数,如果它们是原始类型,如它们不是整数。即使它们是对象,如果每个线程在调用方法之前创建它们并且它们不被重用,它们也可能不会改变。

但这不是全部,因为你无法控制执行的顺序,即使一个线程正在处理,它们也会随机改变,所以如果你说一个全局变量 int myVar = 0;

,方法


    {  // line 10
        myVar = 1;  // line 11
        myVar += 7;  // line 12
    }  // line 13

根本没有保证变量在第12行的开头是1,因为其他一些线程可能已经改变了程序从第11行到第12行的时间内的值。

底线这是一个骗局的秘诀。您需要同步方法或将锁定添加到全局变量以及作为参数传递的对象。