在Java中,局部变量如何变得不线程安全?

在Java中,局部变量如何变得不线程安全?,java,multithreading,thread-safety,local-variables,Java,Multithreading,Thread Safety,Local Variables,我正在学习Java多线程,并阅读了以下声明: 局部变量总是线程安全的。但是请记住,局部变量指向的对象可能不是这样。如果对象是 在方法内部实例化,并且永不转义,因此 问题仅仅因为您将共享对象指定给本地引用, 并不意味着对象自动成为线程安全的 在本例中,object如何变得不线程安全 您能否举例说明局部变量可能不是线程安全的场景以及原因?,因为引用的文本本身表示对象本身(即局部变量)是线程安全的 您可以依赖这样一个事实,即没有外部因素(即没有其他线程)会更改此变量引用的内容 但是,object引用的

我正在学习Java多线程,并阅读了以下声明:

局部变量总是线程安全的。但是请记住,局部变量指向的对象可能不是这样。如果对象是 在方法内部实例化,并且永不转义,因此 问题仅仅因为您将共享对象指定给本地引用, 并不意味着对象自动成为线程安全的

在本例中,
object
如何变得不线程安全


您能否举例说明局部变量可能不是线程安全的场景以及原因?

,因为引用的文本本身表示
对象本身(即局部变量)是线程安全的

您可以依赖这样一个事实,即没有外部因素(即没有其他线程)会更改此变量引用的内容

但是,
object
引用的对象(由
new SomeClass()
创建的对象)可以被其他线程操纵,如果对它的引用以某种方式逃逸。例如,如果您执行了类似于
myGlobalList.add(object)
的操作,并且其他线程可以访问
myGlobalList
,那么另一个线程可以取回该对象并对其调用
setFoo
,这可能会对您的代码产生意外的影响

“能够访问对象的其他线程”称为“转义”,即对象转义


在您过于简化的示例中,这不会发生。您不会将对该对象的引用存储在任何其他地方,因此它当然会保持线程安全。

“如果该对象在方法中实例化,并且从不转义,那么就不会有问题。”假设您声明了一个局部变量,但要给它一个值,您可以执行类似于
SomeClass object=SomeOtherClass.getValue()
的操作。
getValue
返回的内容是否保证不会在另一个线程中修改?这里有一个示例,
对象
已成为非线程安全的。
public class SimpleHttpServlet extends HttpServlet {

 

  protected void Test() {

    // How can `object' become not thread safe
    SomeClass object= new SomeClass ();

  }
}