Chinaunix首页 | 论坛 | 博客
  • 博客访问: 140897
  • 博文数量: 37
  • 博客积分: 277
  • 博客等级: 二等列兵
  • 技术积分: 326
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-17 21:06
文章分类
文章存档

2016年(2)

2015年(11)

2014年(5)

2013年(7)

2012年(4)

2011年(8)

分类: Java

2015-04-09 15:14:50

假设有一个类,有一个引用字段,例如:    

点击(此处)折叠或打开

  1. public class UnLockClass1 {

  2.     private Object ref;

  3.     public void setRef(Object ref) {
  4.         this.ref = ref;
  5.     }

  6.     public void mutiTimeUseRef(){
  7.         int i = 10;
  8.         while(i-- > 0){      
  9.             System.out.println(ref.toString());
  10.         }
  11.     }
  12.     
  13.     public void mutiTimeUseRefV2(){
  14.         int i = 10;
  15.         Object lRef = ref;
  16.         while(i-- > 0){
  17.             System.out.println(lRef.toString());
  18.         }
  19.     }
  20. }

    这个类显然不是线程安全的,因为set 方法可能改变对象的状态。为了将这个类变成线程安全的,可以给set 和 mutiTimeUseRef 加上 synchronize 关键字,这样就可以放心的用在多线程环境下了。因为担心ref 被 set方法
改为Null 的情况而加锁,未免有点得不偿失,于是换了一种写法mutiTimeUseRefV2 , 先将 ref 值给保存起来,这样即使其他线程给 ref 赋值为null ,也不会影响到 mutiTimeUseRefV2 方法的调用,而且不用加锁,如此甚好,

欢迎拍砖


阅读(831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~