今天修改代码时发现findbugs检查出DateTime类型直接set、get方法有问题,要写成如下形式:开始感觉很费劲,后来明白是java对象引用传递的问题:参考http://www.cnblogs.com/hyddd/articles/1391098.html和http://www.cnblogs.com/hyddd/articles/1391118.html
public Date getUpdateTime() {
if (this.updateTime != null) {
Calendar date = Calendar.getInstance();
date.setTime(this.updateTime);
return date.getTime();
} else {
return null;
}
}
public void setUpdateTime(Date updateTime) {
if (updateTime != null) {
Calendar date = Calendar.getInstance();
date.setTime(updateTime);
this.updateTime = date.getTime();
}
}
因为getObj()这个函数把obj对象返回了给外面,JAVA里面对象的传递是使用引用传递,如果对象传递到外面并且在做修改obj的时候没有加锁操作,就是引起刚才的问题。所以如果getObj()函数返回的是对象,那么,请返回一个拷贝,而不要直接返回引用。
这里再总结一下值得注意问题:
1.看下面代码:
public ObjClass2 getObj(){
synchronized (lockTable){
return
this.obj;
}
}
synchronized (lockTable)不能阻止外面的函数修改obj,即:obj=getObj();当赋值完毕后,synchronized (lockTable)无效了,如果后面需要修改obj的值,那么就得注意了!!!
另外建议的是,不直接返回this.obj,而是返回一个this.obj的拷贝。这样可以根本上避免出现上面的问题!
2.同理,在setObj(...)的时候,如果传入的是个对象,也建议是存储传入对象的拷贝,而不(this.obj=obj)这样直接赋值。
3.注意对竞争的资源都使用synchronized (lockTable),不要像上面的Demo代码那样,一处用了,一处没有!