2011-11-17 119 views
3

我有由多个线程在Java program.This方法访问的方法相同的方法有:被多个线程访问

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

现在这种方法不是同步的,所以当多个线程改变上面三种类型的变量的值时,这些改变反映在其他线程或每个线程将具有这些变量的单独副本。

+0

查看http://download.oracle.com/javase/tutorial/essential/concurrency/index.html –

回答

2

全局对象:将反映更改

局部变量:不会

形式参数:对象引用都将反映变化和原始类型的参数将不能反映更改。

0

将改变球体对象 局部变量不会 参数可以改变,如果它们是对象,如果它们是原始类型,如整数,他们不会。即使它们是对象,如果每个线程在调用方法之前创建它们,它们都不会改变,并且它们不会被重用。

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

和方法确实

 

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

没有出示担保在所有的变量是1的行12年初,因为一些其他线程可能已经改变了所花费的时间程序的价值从第11行到第12行。

底线这是一个难题。您需要同步方法或将锁添加到作为参数传递的全局变量和对象。

2

其他一些答案忘记提及一个非常重要的事实。

更改对象作为参数和全局变量通过与其他线程共享然而,:

没有同步你永远不会知道什么时候(也许永远!)这些变化将在其他线程中。除了只允许方法中的一个线程同时阻止100种竞争条件之外,进入和退出同步块还会触发所有的高速缓存被清除,并且数据将在线程/内核之间共享。

多线程很难找到正确的,仔细阅读它。我推荐Goetz的'Java Concurrency in Practice'。