ThreadSafe - juedaiyuer/researchNote GitHub Wiki

#线程安全与共享资源#

##局部变量##

局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的

##局部的对象引用##

public void someMethod(){

  LocalObject localObject = new LocalObject();
  localObject.callMethod();
  method2(localObject);
}

public void method2(LocalObject localObject){

  localObject.setValue("value");
}
  • 每个执行someMethod()的线程都会创建自己的LocalObject对象,并赋值给localObject引用。因此,这里的LocalObject是线程安全的

##对象成员##

  • 对象成员存储在堆上。如果两个线程同时更新同一个对象的同一个成员,那这个代码就不是线程安全的

    package test;

    public class NotThreadSafe { StringBuilder builder = new StringBuilder();

      public void add(String text){
      	this.builder.append(text);
      }
    

    }

    package test;

    public class Test { public static void main(String[] args) { NotThreadSafe sharedInstance = new NotThreadSafe();

      	new Thread(new MyRunnable(sharedInstance)).start();
      	new Thread(new MyRunnable(sharedInstance)).start();
      
      }
    

    }

    class MyRunnable implements Runnable{ NotThreadSafe instance = null;

      public MyRunnable(NotThreadSafe instance){
      	this.instance = instance;
      }
    
      public void run(){
      	this.instance.add("some text");
      }
    

    }