我有由多个线程在Java program.This方法访问的方法相同的方法有:被多个线程访问
- 全局对象变量
- 局部变量
- 形式参数。
现在这种方法不是同步的,所以当多个线程改变上面三种类型的变量的值时,这些改变反映在其他线程或每个线程将具有这些变量的单独副本。
我有由多个线程在Java program.This方法访问的方法相同的方法有:被多个线程访问
现在这种方法不是同步的,所以当多个线程改变上面三种类型的变量的值时,这些改变反映在其他线程或每个线程将具有这些变量的单独副本。
全局对象:将反映更改
局部变量:不会
形式参数:对象引用都将反映变化和原始类型的参数将不能反映更改。
将改变球体对象 局部变量不会 参数可以改变,如果它们是对象,如果它们是原始类型,如整数,他们不会。即使它们是对象,如果每个线程在调用方法之前创建它们,它们都不会改变,并且它们不会被重用。
但这并不是全部,因为你无法控制执行顺序,即使当一个线程正在处理时,它们也会随机改变,所以如果你有一个全局变量 int myVar = 0;
和方法确实
{ // line 10 myVar = 1; // line 11 myVar += 7; // line 12 } // line 13
没有出示担保在所有的变量是1的行12年初,因为一些其他线程可能已经改变了所花费的时间程序的价值从第11行到第12行。
底线这是一个难题。您需要同步方法或将锁添加到作为参数传递的全局变量和对象。
其他一些答案忘记提及一个非常重要的事实。
更改对象作为参数和全局变量通过与其他线程共享然而,:
没有同步你永远不会知道什么时候(也许永远!)这些变化将在其他线程中。除了只允许方法中的一个线程同时阻止100种竞争条件之外,进入和退出同步块还会触发所有的高速缓存被清除,并且数据将在线程/内核之间共享。
多线程很难找到正确的,仔细阅读它。我推荐Goetz的'Java Concurrency in Practice'。
查看http://download.oracle.com/javase/tutorial/essential/concurrency/index.html –