Java多线程 解决private对象逸出--返回副本
发布日期:2021-06-30 13:12:09 浏览次数:2 分类:技术文章

本文共 1294 字,大约阅读时间需要 4 分钟。

文章目录

解决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

转载地址:https://javaweixin6.blog.csdn.net/article/details/108371426 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java多线程 解决private对象逸出-工厂模式(解决对象还未初始化完成就对外暴露)
下一篇:Java多线程 对象未完成初始化就把对象提供给外界--构造方法中新建线程

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月12日 05时05分14秒