• 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代码那样,一处用了,一处没有!

  • 相关阅读:
    .net core 部署到 iis 步骤及报错解决方法
    数据库学习笔记3 基本的查询流 2
    数据库学习笔记 2 数据库文件基本查询
    我对于C#的想法
    数据库学习笔记 一
    openwrt 软件安装依赖冲突
    openwrt 自定义DHCP
    asp.net core 3.1 入口:Program.cs中的Main函数
    c# 匿名方法(函数) 匿名委托 内置泛型委托 lamada
    家庭网络那些事
  • 原文地址:https://www.cnblogs.com/doit8791/p/2987679.html
Copyright © 2020-2023  润新知