重用现有的类而不是创建新的类,可以降低工作量,开发风险以及维护成本。

有时候线程安全类可以支持我们所有的操作,但更多时候,现有的了类只能支持大部分的操作,此时就需要在不破坏线程安全性的情况下添加一个新的操作。

这里的例子:需要一个线程安全的链表,需要提供一个原子的“若没有则添加(Put-If-Absent)”的操作。

同步的List类已经实现了大部分功能,可以根据contains方法和add方法构造一个“若没有则添加”的操作。

修改原始类:不现实

另一个方法:继承这个类,但是继承比直接添加源码到类中更加脆弱,因为现在的同步策略实现被分布到了多个单独维护的源码中。如果底层的类改变了同步策略并选择了不同的锁来保护它的状态变量,那么子类会被破坏。

客户端加锁机制

第三种方法:扩展类的功能,不是直接继承类本身,而是将扩展代码放入一个“辅助类”中。

这里要注意,辅助类的锁和底层对象的锁是有区别的,到时候不要用错了锁。不然同步的方法看上去是加锁了,但是实际上只是假象,由于使用了不同的锁会导致底层对象被其他线程所修改(走的并不是你这个辅助类的加锁方法的代码路径)。

要使方法正确执行,必须使List在实现客户端加锁或者外部加锁使用的是同一把锁。

客户端加锁是指,对于使用某个对象X的客户端代码,使用X本身用于保护其状态的锁来保护这段客户端代码。

还有种情况?

客户端加锁更为脆弱,因为它将类C的加锁代码放到与C完全无关的其他类中。

组合

客户端加锁和继承加锁的方式都很脆弱,一旦有人不遵循加锁策略很可能不安全。

组合方法可以通过自身的内置锁加了一层额外的加锁,而不用关心底层的List是否是线程安全的。

最新文章

  1. UFLDL 教程三总结与答案
  2. hbase-site.xml中HBASE_CLASSPATH 的设置
  3. Jquery基础之DOM操作
  4. CentOS6.5修改yum源
  5. RabbitMQ(五) -- topics
  6. 14款让前端开发者心动的jQuery/CSS3插件及源码
  7. 利用TabWidget实现底部菜单
  8. java基础之hashmap
  9. QQ互联登录回调路径错误redirect uri is illegal(100010)
  10. iOS中—触摸事件详解及使用
  11. Ajax和JSON基础
  12. Java面试题-并发容器和框架
  13. 【Android - 框架】之Glide的使用
  14. linux配置jdk环境详解
  15. 通过自定义注解反射生成SQL语句
  16. Eclipse设置的断点失效的解决办法
  17. readfile & file_get_contents异同
  18. 小甲鱼零基础python课后题 P24 023递归:这帮小兔崽子
  19. Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战
  20. 如何将购物车信息存到Redis中?

热门文章

  1. 学习Microsoft SQL Server 2008技术内幕:T-SQL语法基础
  2. TSynDBDataSet内存表
  3. 【SQL】查询数据库中某个字段有重复值出现的信息
  4. CSS3:3D转换
  5. SQL Server 笔试题总结
  6. ylbtech-LanguageSamples-CollectionClasses(集合类)
  7. 【算法导论C++代码】归并排序
  8. 转: Linux与JVM的内存关系分析
  9. Quartz与Spring的整合使用
  10. GCD编程-串行队列与并发队列