一、设计线程安全的类

在设计线程安全类的过程中,须要包括下面三个基本要素: 

. 找出构成对象状态的全部变量。 

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

. 建立对象状态的并发訪问管理策略。

分析对象的状态,首先从对象的域開始。 变量按作用域划分:
. 全局变量
. 局部变量
. 方法行參
. 异常处理參数


1. 收集同步需求
假设不了解对象的不变性条件与后验条件,那么就不能确保线程安全性。要满足在状态变量的有效值或状态转换上的各种约束条件,就须要借助原子性和封装性。
说的更简略些是Java线程安全都是由于共享变量,共享变量后会由于多个线程同一时候改动导致不对的问题,所以收集一共同拥有多少处会涉及到这些须要同步的变量,仅仅有收集说有可能出问题的因素基于此之上保证全部元素线程安全也才干保证程序是线程安全的。

2. 依赖状态的操作
先验条件是值满足某个条件之后才干进行处理。比如:首先推断一个队列是否为空,假设为空。。。,假设不为空。。。当中推断队列是否为空就是先验条件。

假设在某个操作中包括有基于状态的先验条件,那么这个操作就称为依赖状态的操作。
? 满足可见性就能够?

3. 状态的全部权
单独一个基本对象比較保证其安全性,可是假设是包括对象的集合(容器类 比如:ArrayList),容器类通常表现出一种“全部权分离”的形式。
即使用线程安全的容器类(Collections.synchronizedList(List<T>)),也仅仅能保证容器相关的操作是线程安全的,假设公布了可变对象的引用,就不会拥有独占的控制权。(非线程安全)


二、实例封装

将数据封装在对象内部,能够将数据的訪问限制在对象的方法上,从而更easy确保线程在訪问数据时总能持有正确的锁。

封闭机制更易于构造线程安全的类,由于当封闭类的状态时,在分析类的线程安全性时就无须检查整个程序。

即使封闭能保证对象内全部处理都是现成安全的,可是还须要注意当对象公布后还是可能出现故障,比如HashSet<Persion> 除保证Persion是线程安全外,还须要保证使用它的Set集合是线程安全的。
     - 样例 对象中仅有一个变量,保证此变量线程安全。在方法上使用synchronized

1. Java监听器模式
synchronized通过指定对象锁定

2. 演示样例:车辆追踪
     - 保证容器类实例、容器类包括元素实例线程安全。


三、线程安全性的托付

. 实例讲诉怎样保证集合类及其包括类线程安全性

. 在现有的线程安全类中加入�功能
继承自当前集合类,加锁使加入�的方法保证安全性,可是这样比較脆弱。
组合方式,查看书籍源代码

. 将同步策略文档化

《Java并发编程实战》第四章 对象的组合 读书笔记的更多相关文章

  1. Java并发编程实战 第4章 对象的组合

    Java监视器模式 java监视器模式就是在将共享的数据封装在一个类里面,然后然后所有访问或者修改这些数据的方法都标注为synchronize. 车辆追踪模拟: 使用监视器模式: CarTracker ...

  2. Java并发编程实战 第3章 对象的共享

    可见性 可见性是由于java对于多线程处理的内存模型导致的.这似乎是一种失败的设计,但是JVM却能充分的利用多核处理器的强大性能,例如在缺乏同步的情况下,Java内存模型允许编译器对操作顺序进行重排序 ...

  3. 【JAVA并发编程实战】2、对象的组合

    1. 设计线程安全的类 1.找出构成对象状态的所有变量 2.找出约束状态变量的不变性条件 3.建立对象状态的并发访问管理策略 package cn.xf.cp.ch04; /** * *功能:JAVA ...

  4. Java并发编程实战---第六章:任务执行

    废话开篇 今天开始学习Java并发编程实战,很多大牛都推荐,所以为了能在并发编程的道路上留下点书本上的知识,所以也就有了这篇博文.今天主要学习的是任务执行章节,主要讲了任务执行定义.Executor. ...

  5. Java并发编程实战 第16章 Java内存模型

    什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Be ...

  6. 【java并发编程实战】第一章笔记

    1.线程安全的定义 当多个线程访问某个类时,不管允许环境采用何种调度方式或者这些线程如何交替执行,这个类都能表现出正确的行为 如果一个类既不包含任何域,也不包含任何对其他类中域的引用.则它一定是无状态 ...

  7. Java并发编程实战 第8章 线程池的使用

    合理的控制线程池的大小: 下面内容来自网络.不过跟作者说的一致.不想自己敲了.留个记录. 要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析: 任务的性质:CPU密集型任务.IO ...

  8. 读书笔记-----Java并发编程实战(二)对象的共享

    public class NoVisibility{ private static boolean ready; private static int number; private static c ...

  9. JAVA并发编程实战---第三章:对象的共享(2)

    线程封闭 如果仅仅在单线程内访问数据,就不需要同步,这种技术被称为线程封闭,它是实现线程安全性的最简单的方式之一.当某个对象封闭在一个线程中时,这种方法将自动实现线程安全性,即使被封闭的对象本生不是线 ...

随机推荐

  1. CCF CSP 201604-2 俄罗斯方块

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201604-2 俄罗斯方块 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游 ...

  2. Linux下文件压缩与打包

    Linux常用压缩命令compresscompress压缩出来的文件的后缀是.Z,解压命令是ucompresscompress -c 文件 > 压缩后的文件名 ,选项-v显示压缩过程,选项-c的 ...

  3. Python全栈开发之12、html

    从今天开始,本系列的文章会开始讲前端,从htnl,css,js等,关于python基础的知识可以看我前面的博文,至于python web框架的知识会在前端学习完后开始更新. 一.html相关概念 ht ...

  4. tensorflow初始化参数内存占满问题

    最近使用tensorflow构建了一个浅层的网络,初始化参数的时候发现两个1080ti 22G的显存马上占满 后来发现解决办法为:在创建session的时候把显存设置为自适应即可,如下 config ...

  5. sort change from to range

    SORT FIELDS=COPY OUTREC FINDREP=(IN=X'05',OUT=X'40', STARTPOS=107,ENDPOS=204)

  6. 为什么要使用String

    最近在培训课期间指导初学者.任务之一就是要大家完成一个类,要求这个类对key为String类型的map执行dwarwle操作.其中一位学员完成的类中,有如下方法: void dwarwle(HashM ...

  7. Django Template Language 模板语言

    一.标签 tags 1.普通变量 普通变量用{{ }} 变量名由数字.字母.下划线组成 点.在模板语言中用来获取对象相应的属性值 示例 {# 取variable中的第一个参数 #} {{ variab ...

  8. linux命令大全之cal命令详解(显示日历)

    cal命令可以用来显示公历(阳历)日历. 1.命令格式:cal [参数][月份][年份] 2.命令功能:用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年 ...

  9. [HNOI2008]玩具装箱

    OJ题号: BZOJ1010 思路: 斜率优化动态规划. 由题意得状态转移方程为$f_i=\displaystyle{\min_{j=0}^{i-1}}\{f_j+\left(i-j-1+\displ ...

  10. 鸟哥的私房菜:Bash shell(四)-Bash shell的使用环境

    Bash shell(四)-Bash shell的使用环境   是否记得我们登入主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的, 还有,登入的时候,我们还可以给予使用者一些 ...