我正在学习Java多线程并遇到了very good tutorial online。但我不确定我是否理解作者解释线程安全对象,变量等的部分。引用他,
public void someMethod(){
LocalObject localObject = new LocalObject();
localObject.callMethod();
method2(localObject);
}
public void method2(LocalObject localObject){
localObject.setValue("value");
}
...整个方法someMethod()是线程安全的。即使LocalObject实例作为参数传递给同一个类或其他类中的其他方法,它的使用也是线程安全的。当然,唯一的例外是,如果使用LocalObject作为参数调用的方法之一,则以允许从其他线程访问它的方式存储LocalObject实例。
我理解为什么LocalObject实例是线程安全的。但我想看一个例外情况的例子(上面块引用的最后一行)。如果有人可以编写一个符合最后一行所写内容的代码片段,那将非常有帮助。谢谢!
答案 0 :(得分:1)
public class SomeClass {
private LocalObject cachedLocalObject;
public void someMethod() {
LocalObject localObject = new LocalObject();
localObject.callMethod();
method2(localObject);
}
public void method2(LocalObject localObject) {
this.cachedLocalObject = localObject;
localObject.setValue("value");
}
public LocalObject getCachedLocalObject() { return cachedLocalObject; }
}
在method2()
中缓存对象然后在getCachedLocalObject()
中公开它以供外部使用的组合打破了线程安全:其他一些线程可以使用getCachedLocalObject()
来获取和修改cachedLocalObject
答案 1 :(得分:1)
对比在下一部分中展示:"对象成员"。只要对象保持为线程本地,它就本身就是线程安全的。但是,只要将引用分配给对象的字段,任何引用父对象的线程都可以访问其字段,从而使它们(可能)不是线程安全的。