2013年3月28日星期四

今天修改代码时发现findbugs检查出DateTime类型直接set、get方法有问题,要写成如下形式:开始感觉很费劲,后来明白是java对象引用传递的问题:参考http://www.cnblogs.com/hyddd/articles/1391098.htmlhttp://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代码那样,一处用了,一处没有!

posted on 2013-03-28 21:44  时间朋友  阅读(133)  评论(0编辑  收藏  举报

导航