如何安全的发布对象及使线程封闭的方法

发布对象:使一个对象能够被当前范围之外的代码使用
对象溢出:一个错误的发布,当一个对象还没有被构造完成后,就使他被其他线程所见
线程被看到的发布的引用是最新的,然而被发布对象的状态是过期的。如果一个对象是可变对象,他就需要安全发布才可以

一、安全发布对象的四种方法:
1、在静态初始化函数中初始化一个对象的引用。
2、将对象的引用保存到volatile类型域或者AtomicReference对象中
3、将对象的引用保存到某个正确构造对象的final类型域中
4、将对象的引用保存到一个由锁保护的域中
二、不可变对象 (final)
具备的条件
1、对象创建后不可以被修改
2、对象所有的域都是final类型的
3、对象是正确创建的(在对象创建的期间,this引用没有溢出)
final:
1、修饰类:不可被继承
2、修饰方法:锁定方法不被继承类修改;效率
3、修饰变量:基本数据类型变量不能被修改、引用类型变量在初始化之后,并不能让他再指向另外一个对象

ThreadLocal 线程安全,使用起来比较方便,做到了线程封闭
场景:数据库连接Connection对象采用了线程封闭
线程封闭:把对象封装到一个线程里,只有这一个线程能看到此对象
定义了三个方法:add(),getId(),remove()方法,添加数据,获取数据,移除数据,通filter去放入数据,在interceptor把数据移除出去,避免内存泄漏,可以在接口中实时的获取线程中的信息


** 避免并发问题,可以吧对象设置成不可变对象,把对象封装在一个线程里,只有这一个线程能看到这个对象,那这个对象就不会存在线程安全问题 **

三、线程封闭的方法:

1、Ad-hoc 线程封闭:程序控制实现,最糟糕的(不推介使用)
2、堆栈封闭:局部变量,无并发问题
3、ThreadLocal线程封闭:特别好的封闭方法(推介使用),把数据存到ThreadLocal,可以拿到数据,不用担心线程安全问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值