有人可以举一个这里描述的关于线程安全变量的情况的例子吗?

时间:2015-03-08 04:47:42

标签: java multithreading

我正在学习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实例是线程安全的。但我想看一个例外情况的例子(上面块引用的最后一行)。如果有人可以编写一个符合最后一行所写内容的代码片段,那将非常有帮助。谢谢!

2 个答案:

答案 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)

对比在下一部分中展示:"对象成员"。只要对象保持为线程本地,它就本身就是线程安全的。但是,只要将引用分配给对象的字段,任何引用父对象的线程都可以访问其字段,从而使它们(可能)不是线程安全的。