作者微信 bishe2022

代码功能演示视频在页面下方,请先观看;如需定制开发,联系页面右侧客服
java并发编程笔记

Custom Tab

第一章:并发编程的挑战

  1. ·很重要的一点:

在编程中,多线程带来的问题:CPU上下文切换(CPU切换线程的消耗)、死锁、资源限制问题(硬件和软件)。所以多线程未必会节省时间。

CPU上下文切换:通过减少CPU上下文切换的次数(减少线程数量)、减少CPU上下文切换时的消耗(CAS算法、无锁化编程)

死锁:避免使用多个锁,及时释放锁

资源限制:扩大硬件(集群)、连接池(复用)等

第二章:Java并发机制的底层实现原理

1:volatile的特性:

内存可见性(如果有写操作,会向CPU发送lock前缀的指令,让CPU的本地缓存(L1,L2等)失效)。

禁止指令冲排序。

2:synchronized:

mon

同步方法会锁当前实例

静态方法和静态变量会锁当前class文件

同步方法块,锁synchronized括号内的对象

synchroized锁4中状态:

无锁状态:没有锁

偏向锁:对象头记录偏向的线程,如果还是该线程抢到锁,继续执行该线程。如果是其他线程抢到了,先判断之前的线程是否终止,如果没有终止才会升级到轻量级锁。

轻量级锁:通过CAS操作,来修改Mark Word来竞争锁,如果没有竞争到会自选再去竞争,如果还没获取到,则升级到重量级锁。

重量级锁:没抢到锁的线程会处于阻塞状态

3:CAS原理:

1:通过总线锁来实现(让CPU向内存发送LOCK#信号,其他CPU的请求会被阻塞)

2:通过缓存锁定:内存区域被缓存在CPU的缓存行里,在LOCK操作期间,其他CPU对该内存进行写操作,会导致该缓存行失效。

JAVA实现原子操作,是通过锁和循环CAS来实现。

CAS三大问题:

ABA问题。在变量前面添加版本号。JDK的Atomic包中AtomicStampedReference来解决ABA

循环时间过长。pause指令可以优化,但是不能解决

只能保证一个共享变量的原子操作。把多个变量合成一个变量,JDK中提供AtomicRefrence类保证引用对象之间的原子操作(可以把多个变量保存在一个对象中进行CAS操作)。


Home