前言:

将现有的线程安全的组件组合为更大规模的组件或程序。

通过使用封装技术可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的。

一. 基本要素

1. 找出对象状态的所有变量

如果对象中所有的域都是基本类型的变量,那么这些域将构成对象的全部状态

如果对象的域中引用了其他对象,那么改对象的状态包括被引用的对象的域

final域越多越能简化对象可能状态的分析过程。

2. 找出约束状态变量的不变条件

状态变量的所有者将决定采用何种加锁协议来维持变量的完整性。

  • 单一状态的有效性
  • 状态转换有效性
  • 多个状态变量的不变性

这些相关变量必须在单个原子操作中进行读取或更新。

如果在一个不变性条件中包含多个变量,那么在执行任何访问相关变量的操作时,都必须持有保护这些变量的锁。

3. 建立对象状态的并发访问策略

同步策略,定义了如何在不违反对象不变条件或后验证条件的情况下对其状态的访问操作进行协同。

二. 依赖状态的操作

如果在某个操作中包含有基于状态验证的先验条件,那么这个操作被称为依赖状态的操作。

三. 状态的所有权

状态变量的所有者将决定采用何种加锁协议来维持变量状态的完整性。

四. 实现策略

1. 实例封闭

通过将封闭机制与合适的加锁策略结合起来,可以确保以线程安全的方式来使用非线程安全的对象。

被封闭对象一定不能超出他的作用域。包括:

  • 类的一个实例,作为类的私有成员
  • 某个作用域,局部变量
  • 线程内

Java监视器模式

遵循Java监视器模式的对象会把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护。

私有内置锁对象可以将锁封装起来,使客户端代码无法得到锁,但客户端代码可以通过公有方法访问锁。

2. 线程安全性的委托

将线程安全性委托给现有的线程安全类。

我们可以将线程安全性委托给多个状态变量,只要这些变量是彼此独立的,即组合而成的类并不会在其包含的多个状态变量上增加任何不变性条件。

发布底层状态:

如果一个状态变量是线程安全的,并且没有任何不变性条件来约束它的值,在变量的操作上也不存在任何不允许的状态转换,那么就可以安全的发布这个变量。

3. 扩展现有安全类

3.1 修改原始类

一般情况下很难做到。

3.2 扩展原始类

不够健壮,一般情况下需要分析父类的加锁策略,并与父类加锁策略的实现保持严格的一致性。

3.3 客户端加锁

相当脆弱,需要分析具体实现的加锁策略。

3.4 组合

鼓励使用。

自定义加锁策略,对底层具体实现不做要求。

Java肖先生:专注于Java开发技术的研究与知识分享!

————END————

  • 点赞(编辑不易,感谢您的支持)
  • ...
  • 转发(分享知识,传播快乐)
  • ...
  • 关注(每天更新Java开发技术)
  • ...

推荐阅读

看到网上疯传的《阿里Java架构师成长之路》,网友瞬间沸腾了

Java程序员备战“金九银十”必备的面试技巧(附阿里Java岗面试题)

java queue 线程安全_详解Java高并发——设计线程安全的类相关推荐

  1. java 配置文件的路径_详解java配置文件的路径问题

    详解java配置文件的路径问题 详解java配置文件的路径问题 各种语言都有自己所支持的配置文件,配置文件中有很多变量是经常改变的.不将程序中的各种变量写死,这样能更方便地脱离程序本身去修改相关变量设 ...

  2. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  3. java集合for循环_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  4. java使用集合存储过程_详解java调用存储过程并封装成map

    详解java调用存储过程并封装成map 发布于 2020-5-1| 复制链接 摘记: 详解java调用存储过程并封装成map           本文代码中注释写的比较清楚不在单独说明,希望能帮助到大 ...

  5. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  6. java注解 源码_详解Java注解教程及自定义注解

    详解Java注解教程及自定义注解 更新时间:2016-02-26 11:47:06   作者:佚名   我要评论(0) Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个 ...

  7. java的注解方式_详解Java注解的实现与使用方法

    详解Java注解的实现与使用方法 Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性.在如今各种框架及开发中非常常见,特此说明一下. 如何创建一个注解 每一个自定义的注解都由四 ...

  8. java访问本地文件_详解Java读取本地文件并显示在JSP文件中

    详解Java读取本地文件并显示在JSP文件中 当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相 ...

  9. java的自动装箱_详解Java 自动装箱与拆箱的实现原理

    详解Java 自动装箱与拆箱的实现原理 发布于 2020-7-4| 复制链接 本篇文章主要介绍了详解Java 自动装箱与拆箱的实现原理,小妖觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小妖 ...

  10. java中parent结构_详解java中继承关系类加载顺序问题

    详解java中继承关系类加载顺序问题 实例代码: /** * Created by fei on 2017/5/31. */ public class SonClass extends ParentC ...

最新文章

  1. Centos DNS服务(二)-bind主从配置与基于TSIG加密的动态更新
  2. 用友互联网战略的变与不变
  3. php sql 二次注入,espcms 二次注入一枚
  4. 关于水晶报表的一些错误
  5. 几种服务器端IO模型的简单介绍及实现(转载)
  6. TCP/IP分析(一) 协议概述
  7. DataTable 深入解析数据源绑定原理之高级篇
  8. 5G Next Generation of Communication
  9. linux如何秀爱swap大小,老毛桃PE启动U盘集合CDlinux,BT5可保存设置,wifislax,sliatz中文定制版的方法[存档......
  10. 全国夜间灯光指数数据、GDP密度分布、人口密度分布、土地利用数据、降雨量数据
  11. centos下mysql备份数据库命令_[CentOS]下mysql数据库常用命令总结
  12. Kali渗透测试:使用Word宏病毒进行渗透攻击
  13. Oracle图书馆借阅管理数据库,图书借阅系统的oracle数据库
  14. SSIM(structural similarity index) ---图像质量评价指标之结构相似性
  15. word插入公式为灰色解决办法
  16. 五 . css系列之文本段落属性及应用
  17. anaconda的详细配置安装
  18. web前端需要学MySQL吗_web前端需要学什么?容易学吗?
  19. 又一所985大学成立【人工智能学院】
  20. python - 股票买卖实例

热门文章

  1. iis php5.4配置_PHP5.4 + IIS + Win2008 R2 配置
  2. linq与数据库之添加
  3. 实验吧web-中-忘记密码了
  4. bzoj 1562 [NOI2009]变换序列 二分图
  5. 2018百度之星资格赛:1002:子串查询
  6. [Angular 2] Nesting Elements in Angular 2 Components with ng-content (AKA Angular 2 Transclusion)
  7. python pass关键字神奇吗
  8. 如何自建appender扩展Log4j框架
  9. 如何将spyder打包成exe_exe程序打包成安装文件,自己的程序制作成一键安装程序...
  10. 从零开始学前端:CSS复合选择器 --- 今天你学习了吗?(CSS:Day10)