每个对象都有自己的类实例变量的副本-
在类的
static所有实例之间共享的变量。实例变量不一定是线程安全的,原因是它们可能被调用异步实例方法的多个线程同时修改。
class Example { private int instanceVariable = 0; public void increment() { instanceVariable++; }}
现在,如果两个不同的线程同时调用
increment,那么您将发生数据争用-
instanceVariable在返回的两个方法结束时,可能会增加1或2。您可以通过将
synchronized关键字添加到
increment,或使用a
AtomicInteger而不是
int等来消除这种数据争用,但要点是,仅仅因为每个对象都获得了自己的类实例变量的副本,并不一定意味着变量可以在线程安全的方式-
这取决于类的方法。(例外是
final不可变的变量,它不能以线程不安全的方式进行访问,缺少像序列化黑客这样的愚蠢的东西。)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)