1、读《java并发编程艺术-第二章》-总结

发布于 2022年 02月 23日 01:45

腾讯服务器

88 / 年

  • 上海/北京/广州...
  • 2核 2G 4M
  • Linux/Windows
新年大优惠

腾讯服务器

425 / 年

  • 上海/北京/广州...
  • 4核 8G 10M
  • Linux/Windows
年度最便宜

腾讯服务器

1249 / 年

  • 上海/北京/广州...
  • 8核 16G 14M
  • Linux/Windows
点击查看

前言
     看了好几遍这本书,对于并发编程入门还是挺不错的,所以拿起键盘总结一下《java并发编程艺术》这本书的总结,计划写7-8篇总结,主要对应书本的每一章节进行总结。

一、为什么需要并发编程

  • 并发编程的目的

a、并发编程的目的就是让程序运行的更快

  • 多线程一定比单线程快吗

a、不一定,因为创建线程和线程上下文切换(contextswitch)增加了开销,线程太多还有可能比单线程慢

  • 如何减少创建线程和线程上下文切换

a、减少创建线程创建可以使用线程池
b、无锁并发编程、CAS算法、使用最少线程和使用协程
c、在vm上可以使用vmstat查看上下文的具体情况

  • 何为无锁并发编程、CAS算法

a、无锁并发编程的思想就是尽量避免线程去争抢共享资源,每个线程按照资源区间获取数据,比如按照id区间处理数据等
b、CAS算法通俗一点的说法就是带着目标值和旧的值提做更新,而不需要加锁。
c、使用最少的线程就是根据需要创建合适的线程数量。

二、Java并发机制的底层实现原理

  • 原理

Java代码编译后变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终最终转化为汇编指令在CPU上执行,所以java的并发机制依赖于jvm的实现和cpu的指令。

  • volatile 的作用*

a、声明为volatile 的变量,可以看做是对普通变量的读写上了同一把锁
b、Java线程内存模型确保所有线程看到这个变量的值是一致的
c、它在多处理器开发中保证了共享变量的内存“可见性”

  • volatile 的原理

a、声明为volatile 的变量,在生成汇编执行时,会对生成#LOCK信号
b、Lock前缀的指令在多核处理器下会将当前处理器缓存行的数据写回到系统内存
c、Lock前缀的指令在多核处理器下会将这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效

  • synchronized 作用

a、锁,用户控制多线程的同步,同步是指程序中用于控制不同线程间操作发生相对顺序的机制
b、jdk1.5之前此锁比较重,在jdk1.6只有引入了偏向锁、轻量级锁。

  • synchronized 原理

a、经过sun公司的专家研究发现,在大多数情况下共享资源并不存在竞争,所以对synchronized做出了优化,引入了偏向锁、轻量级锁。
b、synchrnoized的锁是存在Java对象头里的,对象头(非数组)包含两部分数据

  1. Mark Word 主要存储对象的HashCode、分代年龄和锁标记位
  2. Klass Work : 这部分主要是存储指向该对象元数据类型的指针

c、偏向锁 - 当线程进入同步块时,会在对象头和栈帧中记录偏向线程id。后续此线程再进入同步快都不需要使用cas进行操作

d、轻量级锁 - 当有线程对偏向锁竞争之后,就会升级为轻量级锁,自旋满足一定条件后膨胀为重量级锁

  • 处理器如何实现原子操作

a、第一个机制是通过总线锁保证原子性
b、第二个机制是通过缓存锁定来保证原子性

  • Java如何实现原子操作

a、使用循环CAS实现原子操作

使用cas面临的三大问题

  1. ABA问题
  2. 循环时间长开销大
  3. 只能保证一个共享变量的原子操作

b、使用锁机制实现原子操作

注:锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM实现锁的方式都用了循环CAS,即当一个线程想进入同步块的时候使用循环CAS的方式来获取锁

推荐文章