如果一个对象想要被多个线程安全的并发访问,那么这个对象必须是或线程安全的或事实不可变的或由锁来保护的。

1.java监视器模式

大多数对象都是组合对象。当从头开始构建一个类,或者将多个非线程安全的类组合为一个类时,java监视器模式是非常有用的。

遵循java监视器模式的对象会把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护。比如创建姓名类,类里面只有name一个成员变量,则将name声明为private final,然后将赋值和获取方法用synchronized进行加锁即可实现线程安全。

这只是一个最简单的例子,java监视器模式实现本质上就是将可变状态都封装起来,不让外界获取,然后通过对方法加锁,实现对变量访问的同步。

2.线程安全性的委托

当类中的各个组件都已经是线程安全的时,将线程安全的对象委托给线程安全的对象去管理是实现线程安全的一种方式。

比如person类时线程安全的,在新建的类中使用ConcurrentMap对person类对象进行管理,由于两者都是线程安全的,那么该类在访问person对象时就是线程安全的。

3.在现有线程安全类中添加功能

java提供了很多现有的线程安全类,使用现有的类而不是创建类会降低工作量和开发风险。事实上现有的类能支持我们的大部分工作,但是有些时候我们需要一些新的功能,修改类的源代码去实现线程安全无疑是最方便的,但是一般情况下我们无法去修改现有类的源代码;可以自己写类去扩展现有类,然后添加新方法,但是并非所有的类都会将状态向子类公开,而且通过“扩展”的方法比直接将代码添加到类中更加脆弱。所以这里推荐使用implements对现有类进行实现,在实现类里面,将原有方法原封不动的拿过来继续用,不过需要在方法上加锁即可,然后添加我们需要新增的功能方法。

事实上,使用java监听器模式来封装现有的类,并且只要在类中拥有指向底层对象的唯一外部引用,就能确保线程安全性。

最新文章

  1. VirtualBox 桥接上网方式的配置
  2. Linux 下dns的搭建
  3. 对C#泛型实例化对像
  4. hadoop+hive使用中遇到的问题汇总
  5. requireJS的使用_API(1)
  6. jQuery制作图片的等比例缩放
  7. iDSDT搞定显卡和声卡 黑苹果不纠结
  8. [Hive - LanguageManual] DML: Load, Insert, Update, Delete
  9. 文档学习 - UILabel - 属性详解
  10. html+css实现图片的层布局
  11. Flexslider图片轮播、文字图片相结合滑动切换效果
  12. L2,breakfast or lunch
  13. HOJ 1003 Max Sum 解题报告
  14. Asp.net Core 入门实战 2.请求流程
  15. html5+css基础
  16. Postman 接口测试神器
  17. Linux下tomcat6.0与jdk安装
  18. javascript DOM扩展querySelector()和和querySelectorAll()
  19. RabbitMQ的一些说明
  20. rabbitmq关于guest用户登录失败解决方法

热门文章

  1. Docker部署Mysql8.0.20并配置主从复制
  2. Fabric 配置 order节点问题
  3. Eureka系列(三)获取服务Client端具体实现
  4. Python高级语法-多继承MRO相关-多继承顺序(4.5.1)
  5. Flink 反压 浅入浅出
  6. k8s应用环境
  7. ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用
  8. CentOS8更换国内YUM源
  9. 【Tomcat】Tomcat服务器核心配置说明及标签
  10. Redis基础篇(四)持久化:内存快照(RDB)