第1章 简介

第2章 线程安全性

1个状态变量线程安全的模式

多个状态变量线程不安全的模式,在A线程lastNumbers.set和lastFactors.set之间B线程进行这两个set就出问题了,

AtomicReference是替代对象引用的线程安全类

使用synchronized性能很差

synchronized是可重入锁,下面实例先获得LoggingWidget的对象锁(对象锁=方法锁),然后调用doSomething方法,那么当前线程当前对象锁的计数器+1,由于锁是可重入的,那么可以继续调用super.doSomething,计数器再+1,两次doSomething的调用需要同一个对象锁

优化性能方式:减小锁粒度,只在需要修改共享变量的地方加锁

第3章 对象的共享

3.1可见性

经本地测试可能输出0、42、或者死循环。因为无法保证主线程写入的ready值和number值对于读线程来说是可见的。而且ready和number的赋值可能会被指令重排,不一定是程序见到的顺序

如下图,如果某个线程调用了set,那么另外一个正在调用get的线程可能会看到更新后的value值,也可能看不到

如下需要对set和get都进行同步

3.1.2 非原子的64位操作

即使不考虑失效数据问题,在多线程程序中使用共享且可变的 long 和 double 等类型的变量也是不安全的,除非用关键字volatile 来声明它们,或者用锁保护起来。

3.1.3加锁与可见性

加锁的行为不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程都能看到共享变量的最新值,所有执行读操作或者写操作的线程都必须在同一个锁上同步

3.1.4Volatile变量

访问 volatile 变量时不会执行加锁操作,因此也就不会使执行阻塞,因此 volatile 变量是一种比 sychronized 关键字更轻量级的同步机制

volatile用法
当且仅当满足以下所有条件时,才应该使用 volatile 变量:
1.对变量的写入操作不依赖变量的当前值,或者你能确保只有单个线程更新变量的值
2.该变量不会与其他状态变量一起纳入不变性条件中
3.在访问变量时不需要加锁

3.2发布与逸出

3.3线程封闭

线程封闭常见应用jdbc

3.3.3ThreadLocal
保存了特定于线程的值

3.4.2 示例:使用Volatile类型 来发布不可变对象

final类型成员变量在构造方法中初始化,不能在方法中改变指向

volatile用于对象

3.5安全发布

第四章 对象的组合

4.1设计线程安全的类

4.3.2 独立的状态变量

CopyOnWriteArrayList 线程安全的集合

如下,线程不安全样例,list和synchronized不是同一把锁,方法执行时,另一个线程可以同时修改list

4.4.1 客户端加锁机制

改为如下同一把锁

Java并发编程实战读书笔记一相关推荐

  1. Java并发编程实战读书笔记

    Java并发编程 标签(空格分隔): 并发 多线程 基础 线程 在执行过程中,能够执行程序代码的一个执行单元,在Java语言中,线程有四种状态:运行,就绪,挂起,结束. 并发特性 原子性 一个操作不会 ...

  2. Java并发编程实战读书笔记三

    第七章 取消和关闭 Java没有提供任何机制来安全的终止线程,虽然 Thread.stop 和 suspend 等方法提供了这样的机制,但由于存在着一些严重的陷,因此应该避免使用 7.1任务取消 7. ...

  3. Java并发编程实战读书笔记(一)——线程安全性、对象共享

    一.线程安全性 一个对象是否需要是线程安全的,取决于它是否被多个线程访问. 当多个线程访问,并且其中有一个执行写入时,必须采用同步机制,Java中主要的同步关键字是 synchronized 独占加锁 ...

  4. Java并发编程实战读书笔记二

    第五章 基础构建模块 5.1 同步容器类 5.1.1 同步容器类的问题 如下,如果list含有10个元素,线程A调用getLast的同时线程B调用deleteLast,那么getLast可能会报Arr ...

  5. java并发编程实践 读书笔记_Java - 并发编程实践(读书笔记)

    [注] 同步机制保证:1)原子性 2)内存可见性: Volatile变量只能保证:1)可见性: - 恰当的同步,同步的弱形式,确保对一个变量的更新以可预见的方式告知其他线程. [注] 用锁来协调访问变 ...

  6. Java 并发编程艺术 读书笔记

    第 1 章 并发编程的挑战 1.1.3 如何减少上下文切换 减少上下文切换的方法有无锁并发编程.CAS 算法.使用最少线程和使用协程. 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程处理数 ...

  7. Java并发编程艺术----读书笔记(二)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a724888/article/details/64214595  java并发编程艺术2 jav ...

  8. JAVA并发编程艺术读书笔记(1,2章节)

    第一章 并发编程的挑战 为什么要使用并发编程? 主要是为了更有效地利用资源.即使是单核的CPU也可以多线程执行程序,多线程实际上是CPU分配时间片给各个线程,因为时间片非常短,所以看起来就像在同事执行 ...

  9. Java并发编程艺术读书笔记

    1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...

最新文章

  1. 【转】Android兼容性测试CTS --环境搭建、测试执行、结果分析
  2. python解释器可以使用什么命令_python解释器用什么写的
  3. Linux高性能网络:协程系列08-协程实现之调度器
  4. 次要GC,主要GC与完整GC
  5. 使用指针在函数中交换数值
  6. Datawale编程学习之哈希表和字符串(4)
  7. 消耗报表数据库呈现了流动变乱的回滚段破损(三)
  8. Latex 求职简历模版
  9. 网络入门—家庭组网介绍基本网络知识
  10. c语言提取数字的每一位,C++,如何提取数字的每一位
  11. 详解CSS中的百分号%设置
  12. 有个程序媛上司是什么体验
  13. 飞线(jump wire)
  14. 软件著作权的转让问题
  15. 微信小程序showToast在真机中显示时间不可控制,显示时间短
  16. 如何才能让你的网店生意好到爆?
  17. Windows10 10大高级功能,个个功能强大,5倍提升工作效率
  18. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GR
  19. 百读不厌《破窑赋》!真正的千古奇文!
  20. 虎书学习笔记2:图形学基础数学(向量、点积、叉积、)

热门文章

  1. SharePoint Framework 1.15.2 发布,包含 Viva 连接、Microsoft Teams 和 SharePoint 的更新
  2. opencv打开单双目摄像头
  3. UDP 的报文结构和注意事项
  4. 六堡一箩筐首场线下品鉴会+线上直播助推六堡茶营销创新
  5. 分段线性插值法实验报告_数值分析-插值法
  6. 韦东山 数码相框 项目学习 (七)awtk的移植
  7. docker inspect 详解
  8. 【读书笔记】《美丽新世界》
  9. 十二天宫之天蝎座女生篇
  10. js异步与同步的区别