java高并发中不可变对象是什么
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,java高并发中不可变对象是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。有一种对象一旦发布了,那么他就是安全对象,这就是不可变对象
千家信息网最后更新 2025年02月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安全错误
数据库的锁怎样保障安全
网站信息采集到数据库
南京珈蓝网络技术有限公司
莆田市影锋网络技术有限
软件开发学好理科吗
计算机网络技术一建专业怎么选
数据库中所有的表都建索引
软件开发最佳年龄
开源型数据库统称
网络安全的管理策略
软件测试和软件开发哪个厉害
scada软件开发工程师
服务器视频防盗链
sq2数据库
指南数据库
网络安全教学活动与反思
专利软件开发计划组切片
软件开发方法的发展
如何去除服务器激活水印
政府网络安全保密自查报告
网络安全审查互联网公司
合肥创新管理软件开发
北京交换集市网络技术有限公司
南京珈蓝网络技术有限公司
济南网络安全座谈会
网络技术与应用实验答案
网络安全法立法的方针是
forest移服务器
戴尔服务器短接开机
进击的巨人立体机动服务器
数学不好能学网络安全吗