java高并发中不可变对象是什么
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,java高并发中不可变对象是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。有一种对象一旦发布了,那么他就是安全对象,这就是不可变对象
千家信息网最后更新 2025年01月23日java高并发中不可变对象是什么
java高并发中不可变对象是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
有一种对象一旦发布了,那么他就是安全对象,这就是不可变对象。
不可变对象需要满足的条件:
对象创建以后其状态就不能修改
对象所有的域都是final类型
对象是正确创建的(在对象创建期间,this引用没有逸出)
final关键字:类、方法、变量
修饰类:不能被继承。final类中的成员变量可以根据需要设置为final,要注意的是final类中的所有成员方法都会被隐式的指定为final方法。
修饰方法:1. 锁定方法不被继承类修改;2. 效率
修饰变量:基本数据类型变量在初始化之后就不能修改了,引用类型变量在初始化之后便不能指向另外一个对象
下面举例说明final修饰变量:
@Slf4j@NotThreadSafepublic class ImmutableExample1 { private final static Integer a = 1; private final static String b = "2"; private final static Mapmap = new HashMap<>(); static { map.put(1, 2); map.put(2, 3); } public static void main(String[] args) {// a = 2;// b = "3";// map = new HashMap<>(); map.put(1, 3); log.info("{}", map.get(1)); }}
map引用变量不可以指定新的引用,但却可以修改里面的值。
这样就会引发线程安全方面的问题。
除了final定义不可变对象,是否还有其他手段定义不可变对象?当然可以
Collections.unmodifiableXX: Collection、List、Set、Map......
Guava:ImmutableXXX:Collection、List、Set、Map
@Slf4j@ThreadSafepublic class ImmutableExample2 { private static Mapmap = new HashMap<>(); static { map.put(1, 2); map.put(2, 3); map = Collections.unmodifiableMap(map); } public static void main(String[] args) { map.put(1, 3); map.put(3,4); log.info("{}", map.get(3)); }}
这样运行就会报错:
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.Collections$UnmodifiableMap.put(Collections.java:1457) at com.vincent.example.immutable.ImmutableExample2.main(ImmutableExample2.java:24)
也就是说用Collections.unmodifiableMap声明一个变量,他的内容就不可以修改了。数据不会被污染。
@ThreadSafepublic class ImmutableExample3 { private final static ImmutableListlist = ImmutableList.of(1,2,3); private final static ImmutableSet set = ImmutableSet.copyOf(list); private final static ImmutableMap map = ImmutableMap.of(1,2,3,4); private final static ImmutableMap map2 = ImmutableMap. builder().put(1,2).put(3,4).build(); public static void main(String[] args) { map2.put(4,5); }}
根据变量实际情况变成最好变成不可变对象,如果可以尽量把对象变成不可变对象,这样在多线程情况下就不会出现线程安全问题了。
看完上述内容,你们掌握java高并发中不可变对象是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
对象
变量
可变
方法
问题
安全
内容
类型
线程
就是
情况
成员
数据
更多
束手无策
为此
也就是
也就是说
关键
关键字
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
金仓数据库copy命令无法使用
计算机网络技术基础学后总结
长沙哪学校学软件开发怎么样
怎样查询网络连接数据库
安卓9.0软件开发
抢购软件开发需要
滦州市教育局网络安全活动
网络安全专业普招专生本大学
西电杭州研究院网络安全
2019网络安全试卷
软件开发合作协议
先装t3后装数据库如何连接
sql数据库设置外键教程
iis 服务器连接数据库
心理软件开发商
网易企业邮箱的服务器
软件开发规章制度
云服务器的cpu
湖南新品服务器
多个文件夹共享数据库
白帽网络安全学院
天津嵌入式软件开发招聘
oracle数据库老是锁表
软件开发在上海找工作
解决服务器安全风险的功能
延庆区网络技术服务采购
数据库中的结构函数
青岛企业软件开发流程
服务器是一种
江苏电商软件开发多少钱