如何使用本地对象引用是线程安全的?

Raj*_*mar 0 java multithreading thread-safety

我读了jakob jenkov的教程,

public void someMethod(){

  LocalObject localObject = new LocalObject();

  localObject.callMethod();
  method2(localObject);
}

public void method2(LocalObject localObject){
  localObject.setValue("value");
}
Run Code Online (Sandbox Code Playgroud)

是线程安全的.但我觉得

public class LocalObject extends Thread {
    public void run(){
        //LocalObject a= new LocalObject();
        method2(this);
    }

    public void someMethod(){
        LocalObject localObject = new LocalObject();

        localObject.callMethod();
        method2(localObject);
    }

    public void method2(LocalObject localObject){
        localObject.setValue("value");
    }
    public void setValue(String s){

    }
    public void callMethod(){

    }
    public static void main(String args[]){
        LocalObject a= new LocalObject();
        a.start();
        a.method2(a);
    }

}
Run Code Online (Sandbox Code Playgroud)

是不是线程线程安全,因为两个线程1. main&2 LocalObject.的线程正在访问method2,它有一个方法setValue
我误解了它?

ppe*_*rka 7

误解源于这样一个事实,即虽然有两个线程同时调用mathod2(),但它们在类的不同实例上调用LocalObject:

public void run(){
    LocalObject a= new LocalObject(); //this is a new instance 
    method2(a);
}


public static void main(String args[]){
    LocalObject a= new LocalObject(); //this is an antirelz different instance
    a.start(); 
    a.method2(a);
}
Run Code Online (Sandbox Code Playgroud)

如果是这样的话

public void run(){
    //YIKES - not thread safe -- method 2 can be called from outside!
    method2(this); 
}
Run Code Online (Sandbox Code Playgroud)

然后会有一个问题......但这不会与anz方式的例子有关.