多个线程访问同一方法

3

我有一个在Java程序中被多个线程访问的方法。这个方法有以下内容:

  1. 全局对象变量
  2. 局部变量
  3. 形式参数。

现在,这个方法没有同步,因此当多个线程更改上述三种类型变量的值时,这些更改是否会反映在其他线程中,还是每个线程都有自己的变量副本。


请查看http://download.oracle.com/javase/tutorial/essential/concurrency/index.html,该网址与编程有关。 - Liviu T.
3个回答

2

全局对象:会反映更改。

局部变量:不会反映更改。

形式参数:对象引用将反映更改,原始类型的参数不会反映更改。


2
一些其他答案忘记提到一个非常重要的事实。传递作为参数和全局变量的对象的更改将与其他线程共享,但是:如果没有同步,您永远不会知道(也许永远不会!)这些更改何时会在其他线程中显示。除了只允许一个线程同时进入该方法以防止100种竞争条件之外,进入和退出同步块还将触发清除所有缓存并在线程/核心之间共享数据。多线程编程极其难以正确处理,请仔细阅读相关资料。我推荐阅读Goetz的《Java并发编程实践》。

0

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

但这还不是全部,由于您无法控制执行顺序,即使一个线程正在处理,它们也会随机更改。例如,如果您有一个全局变量 int myVar = 0; 并且该方法执行以下操作:

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

不能保证在第12行开始时变量将为1,因为其他线程可能在程序从第11行到第12行所需的时间内更改了该值。

总之,这是一场灾难的配方。您需要同步该方法或向全局变量和作为参数传递的对象添加锁定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接