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"); }}