我有一个在Java程序中被多个线程访问的方法。这个方法有以下内容:
- 全局对象变量
- 局部变量
- 形式参数。
现在,这个方法没有同步,因此当多个线程更改上述三种类型变量的值时,这些更改是否会反映在其他线程中,还是每个线程都有自己的变量副本。
我有一个在Java程序中被多个线程访问的方法。这个方法有以下内容:
现在,这个方法没有同步,因此当多个线程更改上述三种类型变量的值时,这些更改是否会反映在其他线程中,还是每个线程都有自己的变量副本。
全局对象:会反映更改。
局部变量:不会反映更改。
形式参数:对象引用将反映更改,原始类型的参数不会反映更改。
全局对象将被更改,本地变量不会被更改。如果参数是对象,则可以更改它们,如果它们是像整数这样的原始类型,则不会更改。即使它们是对象,如果每个线程在调用方法之前刚好创建它们并且它们没有被重复使用,它们也可能不会更改。
但这还不是全部,由于您无法控制执行顺序,即使一个线程正在处理,它们也会随机更改。例如,如果您有一个全局变量 int myVar = 0; 并且该方法执行以下操作:
{ // line 10 myVar = 1; // line 11 myVar += 7; // line 12 } // line 13
不能保证在第12行开始时变量将为1,因为其他线程可能在程序从第11行到第12行所需的时间内更改了该值。
总之,这是一场灾难的配方。您需要同步该方法或向全局变量和作为参数传递的对象添加锁定。