java高并发中不可变对象是什么
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,java高并发中不可变对象是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。有一种对象一旦发布了,那么他就是安全对象,这就是不可变对象
千家信息网最后更新 2025年12月01日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 Map map = 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 Map map = 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 ImmutableList list = 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安全错误
数据库的锁怎样保障安全
数据库安装服务器配置
王者荣耀云服务器在哪里
华为手机云服务器是什么
数据库通常包括什么地方
星巴克软件开发
春考网络技术考点
分布式数据库是否为主流
服务器怎么建立共享磁盘
国电通网络技术有限公司咨询师
最强大网络安全公司排名
软件开发 人时
知名网络技术培训前10名
海报分享软件开发
数据库常见的连接查询方式
七日杀正版服务器网站
计算机网络技术的方向
铜陵软件开发外包公司
fact数据库
硅谷里软件开发管理的工具
奉贤区管理软件开发咨询热线
内蒙古蘑菇云网络技术有限公司
能翻墙服务器
最大的商业数据库
9月网络安全月
安徽云医互联网科技
公交卡连接手机显示服务器异常
上海核酸服务器
国家级的网络安全基地
网络安全手抄报黑白打印
怎么做服务器公告弹窗