JCIP_4_02_扩展现有安全类

场景

为现存的线程安全类添加功能(对现存的线程安全类进行功能扩展),有时工程中现存的线程安全类只能支持大部分我们需要的操作,此时就需要在不破坏线程安全性的情况下添加一些新的操作。

分析/解决方法

1.修改原始类

为现存线程安全的类添加一个新的原子操作,最安全的方法是修改原始的类,但是通常无法做到,因为我们可能无法访问或修改类的源代码。要想修改原始的类,就需要理解代码中的同步策略这样增加的功能才能与原有的设计保持一致。如果直接将新方法添加到类中,那么意味着实现同步策略的所有代码仍然处于一个源代码文件中,从而更容易理解和维护。

2.扩展原始类

另一种办法是扩展这个类,就是利用类的继承、多态甚至是反射机制对现存类进行扩展。这种办法比直接将代码添加到类中更加脆弱,因为现在的同步策略实现被分布到多个单独维护的源码文件中。如果底层的类改变了同步策略并选择了不同的锁来保护它的状态变量,那么依赖它的子类或是扩展逻辑会被破坏,因为在同步策略改变后它无法再使用正确的锁来控制对基类状态的并发访问。

3.扩展原始类的功能

扩展类的功能并不是扩展类本身,而是将扩展代码放入一个“辅助类”中,这种方式会将类C的加锁代码放到与C完全无关的其它类中,当在那些加锁策略定义模糊、易变的类上使用此方式时需要特别小心。

4.组合

新建原始类的代理类,通过对原始类的操作委托给底层的原始类实例来实现原始类所支持的所有方法,同时还可以增加新支持的操作。代理类通过自身的内置锁增加了一层额外的锁,它并不关心低层的原始类实例是否是线程安全的。

使用组合方式扩展现存线程安全类需要保证传递的原始类对象后续不能再被直接使用,只能通过新建的代理类来访问。

资料

1.Java Concurrency in practice (Java并发编程实战)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值