共计 1504 个字符,预计需要花费 4 分钟才能阅读完成。
简介
同步系列到此就结束了,本篇文章对同步系列做一个总结。
脑图
下面是关于同步系列的一份脑图,列举了主要的知识点和问题点,看过本系列文章的同学可以根据脑图自行回顾所学的内容,也可以作为面试前的准备。
如果有需要高清无码原图的同学,可以关注公众号“彤哥读源码”,回复“sync”领取。
总结
所谓同步,就是保证多线程(包括多进程)对共享资源的读写能够安全有效的运行。
根据同步的运用场景的不同,实现同步的方式也是随之一起变化,但是总结下来,这些实现方式之间又有一些共通之处。
不管是互斥锁、读写锁、信号量、CountDownLatch、回环栅栏、Phaser,还是各种分布式锁,它们都是基于对同一个共享变量(状态变量)的控制,以达到同步的目的。
互斥锁,state 为大于等于 1(可重入)表示已加锁,state 为 0 表示未加锁;
读写锁,state 的高 16 位存储读的次数【本篇文章由公众号“彤哥读源码”原创】,低 16 位存储写的次数;
信号量,state 存储许可的次数,被使用一次许可减一,被释放一次许可加一;
CountDownLatch,state 存储初始次数,countDown()次数减一,当次数减为 0 的时候 await()被激活;
回环栅栏,基于 ReentrantLock 实现,相当于在 CountDownLatch 的基础上加了“代”的概念,保证可重复使用;
Phaser,state 的高 32 位存储当前阶段 phase,中 16 位存储当前阶段参与者(任务)的数量 parties,低 16 位存储未完成参与者的数量 unarrived,每个阶段的参与者都可以控制,相对于回环栅栏更灵活;
mysql 分布式锁 ,基于数据库的 get_lock()/release_lock() 对共享变量进行控制;
zookeeper 分布式锁,基于有序临时节点对共享变量进行控制;
redis 分布式锁,基于内存键值对对共享变量进行控制;
总结下来,所有同步器的关键因素只有一个——共享变量,只要能够对共享变量进行精确的控制,就能实现同步,以后出现新的组件我们一样可以根据这条原理使用新的组件来实现分布式同步器。
彩蛋
下一个系列我们将学习线程(池)相关的知识点,敬请期待!
推荐阅读
1、死磕 java 同步系列之开篇
2、死磕 java 魔法类之 Unsafe 解析
3、死磕 java 同步系列之 JMM(Java Memory Model)
4、死磕 java 同步系列之 volatile 解析
5、死磕 java 同步系列之 synchronized 解析
6、死磕 java 同步系列之自己动手写一个锁 Lock
7、死磕 java 同步系列之 AQS 起篇
8、死磕 java 同步系列之 ReentrantLock 源码解析(一)——公平锁、非公平锁
9、死磕 java 同步系列之 ReentrantLock 源码解析(二)——条件锁
10、死磕 java 同步系列之 ReentrantLock VS synchronized
11、死磕 java 同步系列之 ReentrantReadWriteLock 源码解析
12、死磕 java 同步系列之 Semaphore 源码解析
13、死磕 java 同步系列之 CountDownLatch 源码解析
14、死磕 java 同步系列之 AQS 终篇
15、死磕 java 同步系列之 StampedLock 源码解析
16、死磕 java 同步系列之 CyclicBarrier 源码解析
17、死磕 java 同步系列之 Phaser 源码解析
18、死磕 java 同步系列之 mysql 分布式锁
19、死磕 java 同步系列之 zookeeper 分布式锁
20、死磕 java 同步系列之 redis 分布式锁进化史
欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。