第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. maven整合@data注解_springboot整合spring Cache(redis)
  2. fputc会覆盖吗_深覆盖 VS 深覆合如何区分?这一篇看完就都明白了!
  3. 乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界
  4. 本地浏览器缓存sessionStorage(临时存储) localStorage(长期存储)的使用
  5. 给侄子推荐的中学教辅资料清单
  6. ci持续集成工程师前景_『中级篇』docker之CI/CD持续集成-项目生成镜像(76)
  7. 5.1.1越狱后必装插件!
  8. kohana的modules集合
  9. 支付宝 “集五福”今日开启;小米起诉美国国防部;Chrome 再次屏蔽七个端口 | 极客头条...
  10. centos7.x表安装iptables防火墙
  11. wireless 大作业 linux,Wire/Wireless Network Configuration in Linux
  12. Apowersoft ApowerMirror v1.4.5 终身商业授权破解版 安卓/iPhone投屏控制软件
  13. select和epoll
  14. 中国省市区列表MySQLl数据库脚本
  15. 软考高项(信息系统项目管理师)计算题公式汇总
  16. 移动安全工具-jadx
  17. 2009 中国七夕情人节 --期待
  18. qnap虚拟linux,QNAP进阶教程:威联通NAS 虚拟机教程 安装精简版win10、软路由、群晖NAS系统!...
  19. 如何访问sci-hub?(更新于2017年11月26日)
  20. Windows Subsystem for Android™ 安装教程

热门文章

  1. JAVA 实现阿里云短信发送功能
  2. 我希望,男女交友网站进入「甜蜜分众」世代
  3. 7-22 显示菱形图形 (40分)
  4. textarea赋值
  5. 【go modules】missing go.sum entry for module providing package
  6. #ifndef 和 #endif
  7. 自然语言处理(NLP)实验——比较各大翻译系统
  8. java计算器简单源代码_java 简单的计算器程序实例代码
  9. Windows 10 安装 NVIDIA cuDNN v7.6.0 for CUDA 10.1
  10. 关于C++中unsigned类型