专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
玉伯  ·  🍀 YouMind 0.3: The ... ·  20 小时前  
程序员的那些事  ·  月薪已炒到6W?强烈建议大家冲一冲这个新兴领域 ·  2 天前  
极客之家  ·  7.3k star,一款开源高效的知识管理神器! ·  2 天前  
玉伯  ·  欢迎试用,过几天正式发布 0.3 ... ·  2 天前  
51好读  ›  专栏  ›  程序员大咖

线程安全与共享资源

程序员大咖  · 公众号  · 程序员  · 2017-12-17 10:24

正文

请到「今天看啥」查看全文



对象的局部引用和基础类型的局部变量不太一样。尽管引用本身没有被共享,但引用所指的对象并没有存储在线程的栈内。所有的对象都存在共享堆中。如果在某个方法中创建的对象不会逃逸出(译者注:即该对象不会被其它方法获得,也不会被非局部变量引用到)该方法,那么它就是线程安全的。实际上,哪怕将这个对象作为参数传给其它方法,只要别的线程获取不到这个对象,那它仍是线程安全的。下面是一个线程安全的局部引用样例:


public void someMethod(){

LocalObject localObject = new LocalObject();

localObject.callMethod();

method2(localObject);

}

public void method2(LocalObject localObject){

localObject.setValue("value");

}


样例中LocalObject对象没有被方法返回,也没有被传递给someMethod()方法外的对象。每个执行someMethod()的线程都会创建自己的LocalObject对象,并赋值给localObject引用。因此,这里的LocalObject是线程安全的。事实上,整个someMethod()都是线程安全的。即使将LocalObject作为参数传给同一个类的其它方法或其它类的方法时,它仍然是线程安全的。当然,如果LocalObject通过某些方法被传给了别的线程,那它就不再是线程安全的了


对象成员


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


public class NotThreadSafe{

StringBuilder builder = new StringBuilder();

public add(String text){







请到「今天看啥」查看全文