-
public class UnLockClass1 {
-
-
private Object ref;
-
-
public void setRef(Object ref) {
-
this.ref = ref;
-
}
-
-
public void mutiTimeUseRef(){
-
int i = 10;
-
while(i-- > 0){
-
System.out.println(ref.toString());
-
}
-
}
-
-
public void mutiTimeUseRefV2(){
-
int i = 10;
-
Object lRef = ref;
-
while(i-- > 0){
-
System.out.println(lRef.toString());
-
}
-
}
-
}
-
这个类显然不是线程安全的,因为set 方法可能改变对象的状态。为了将这个类变成线程安全的,可以给set 和 mutiTimeUseRef 加上 synchronize 关键字,这样就可以放心的用在多线程环境下了。因为担心ref 被 set方法
改为Null 的情况而加锁,未免有点得不偿失,于是换了一种写法mutiTimeUseRefV2 , 先将 ref 值给保存起来,这样即使其他线程给 ref 赋值为null ,也不会影响到 mutiTimeUseRefV2 方法的调用,而且不用加锁,如此甚好,
欢迎拍砖