zoukankan      html  css  js  c++  java
  • 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代码那样,一处用了,一处没有!

  • 相关阅读:
    算法视频库下载常用网址(转载)
    Python study 1
    $X-Real-Ip和$X-Forwarded-For的区别
    python装饰器
    python迭代器和生成器
    python函数动态参数详解
    python常用模块
    python 正则re模块
    pycharm5新版注册
    老男孩python自动化运维作业2
  • 原文地址:https://www.cnblogs.com/doit8791/p/2987679.html
Copyright © 2011-2022 走看看