您当前的位置: 首页 >  Java

java持续实践

暂无认证

  • 1浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java多线程 解决private对象逸出--返回副本

java持续实践 发布时间:2020-09-02 22:10:24 ,浏览量:1

文章目录
      • 解决private对象逸出--返回副本

解决private对象逸出–返回副本

如下的代码, 使用的是返回对象的副本的方式, 来解决private对象逸出

package com.thread.background;

import java.util.HashMap;
import java.util.Map;

/**
 * 类名称:ReleaseEscapeDemo
 * 类描述:  发布逸出的演示
 *
 * @author: https://javaweixin6.blog.csdn.net/
 * 创建时间:2020/9/1 7:52
 * Version 1.0
 */
public class ReleaseEscapeDemo {
    //定义一个private私有变量
    private Map states;

    public ReleaseEscapeDemo() {
        states = new HashMap();
        states.put("1", "a");
        states.put("2", "b");
        states.put("3", "c");
    }

    //对象逸出  返回了一个私有变量
    public Map getStates() {
        return states;
    }

    /**
     * 返回对象的副本
     * @return
     */
    public Map getStatesCopy() {
        return new HashMap(states);
    }

    public static void main(String[] args) {
        ReleaseEscapeDemo re = new ReleaseEscapeDemo();
        
        System.out.println(re.getStatesCopy().get("1"));
        re.getStatesCopy().remove("1");

        System.out.println(re.getStatesCopy().get("1"));
    }
}

其关键的代码如下 , 新建立一个getStatesCopy方法, 里面返回一个new hashmap. 并且这个map 的构造 直接传入private的map . 相当于把private的map赋值给了新的map . 这样别的线程获取这个private的map的时候, 即使改了map 的值, 也只是该的new的map 的值, 而没有改private的map 的值. 测试的代码如下, 此处调用了三次getStatesCopy方法, 实际上是获取的三个map. 因此即使remove掉了key为1的元素, 再次获取也能拿得到. 所以控制台打印了两个1

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0389s