我有一个方法可以被java程序中的多个线程访问。这个方法有:
现在这个方法不同步,所以当多个线程更改上述三种类型变量的值时,这些更改会反映在其他线程中,或者每个线程都会有这些变量的单独副本。
答案 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行的时间内的值。
底线这是一个骗局的秘诀。您需要同步方法或将锁定添加到全局变量以及作为参数传递的对象。