死磕java同步系列之终结篇

     2022-04-01     651

关键词:

欢×××”,查看更多源码系列文章, 与彤哥一起畅游源码的海洋。

(手机横屏看源码更方便)


简介

同步系列到此就结束了,本篇文章对同步系列做一个总结。

脑图

下面是关于同步系列的一份脑图,列举了主要的知识点和问题点,看过本系列文章的同学可以根据脑图自行回顾所学的内容,也可以作为面试前的准备。

技术图片

如果有需要原图的同学,可×××哥读源码”,回复“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分布式锁,基于内存键值对对共享变量进行控制;

总结下来,所有同步器的关键因素只有一个——共享变量,只要能够对共享变量进行精确的控制,就能实现同步,以后出现新的组件我们一样可以根据这条原理使用新的组件来实现分布式同步器。

彩蛋

下一个系列我们将学习线程(池)相关的知识点,敬请期待!

死磕java原子类之终结篇(面试题)(代码片段)

概览原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只... 查看详情

死磕java同步系列之开篇

简介同步系列,这是彤哥想了好久的名字,本来是准备写锁相关的内容,但是java中的CountDownLatch、Semaphore、CyclicBarrier这些类又不属于锁,它们和锁又有很多共同点,都是为了协同多线程的执行,都是一种同步器,所以这里就借... 查看详情

死磕java同步系列之synchronized解析(代码片段)

问题(1)synchronized的特性?(2)synchronized的实现原理?(3)synchronized是否可重入?(4)synchronized是否是公平锁?(5)synchronized的优化?(6)synchronized的五种使用方式?简介synchronized关键字是Java里面最基本的同步手段,它经... 查看详情

死磕java同步系列之phaser源码解析

问题(1)Phaser是什么?(2)Phaser具有哪些特性?(3)Phaser相对于CyclicBarrier和CountDownLatch的优势?简介Phaser,翻译为阶段,它适用于这样一种场景,一个大任务可以分为多个阶段完成,且每个阶段的任务可以多个线程并发执行,... 查看详情

死磕java同步系列之semaphore源码解析(代码片段)

问题(1)Semaphore是什么?(2)Semaphore具有哪些特性?(3)Semaphore通常使用在什么场景中?(4)Semaphore的许可次数是否可以动态增减?(5)Semaphore如何实现限流?简介Semaphore,信号量,它保存了一系列的许可(permits),每次调... 查看详情

死磕java同步系列之semaphore源码解析(代码片段)

问题(1)Semaphore是什么?(2)Semaphore具有哪些特性?(3)Semaphore通常使用在什么场景中?(4)Semaphore的许可次数是否可以动态增减?(5)Semaphore如何实现限流?简介Semaphore,信号量,它保存了一系列的许可(permits),每次调... 查看详情

死磕java同步系列之countdownlatch源码解析(代码片段)

??欢迎关注我的公众号“彤哥读源码”,查看更多源码系列文章,与彤哥一起畅游源码的海洋。(手机横屏看源码更方便)问题(1)CountDownLatch是什么?(2)CountDownLatch具有哪些特性?(3)CountDownLatch通常运用在什么场景中?(4... 查看详情

死磕java同步系列之volatile解析(代码片段)

问题(1)volatile是如何保证可见性的?(2)volatile是如何禁止重排序的?(3)volatile的实现原理?(4)volatile的缺陷?简介volatile可以说是Java虚拟机提供的最轻量级的同步机制了,但是它并不容易被正确地理解,以至于很多人不... 查看详情

死磕java同步系列之reentrantreadwritelock源码解析(代码片段)

问题(1)读写锁是什么?(2)读写锁具有哪些特性?(3)ReentrantReadWriteLock是怎么实现读写锁的?(4)如何使用ReentrantReadWriteLock实现高效安全的TreeMap?简介读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问... 查看详情

死磕java同步系列之jmm(javamemorymodel)(代码片段)

简介Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。硬件内存模型在正式讲解Java的内存模型之前,我们有必要先了... 查看详情

死磕java同步系列之zookeeper分布式锁

问题(1)zookeeper如何实现分布式锁?(2)zookeeper分布式锁有哪些优点?(3)zookeeper分布式锁有哪些缺点?简介zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它可以为分布式应用提供一致性的服务,它是Hadoop和... 查看详情

死磕java同步系列之mysql分布式锁

问题(1)什么是分布式锁?(2)为什么需要分布式锁?(3)mysql如何实现分布式锁?(4)mysql分布式锁的优点和缺点?简介随着并发量的不断增加,单机的服务迟早要向多节点或者微服务进化,这时候原来单机模式下使用的sync... 查看详情

死磕java同步系列之redis分布式锁进化史

问题(1)redis如何实现分布式锁?(2)redis分布式锁有哪些优点?(3)redis分布式锁有哪些缺点?(4)redis实现分布式锁有没有现成的轮子可以使用?简介Redis(全称:RemoteDictionaryServer远程字典服务)是一个开源的使用ANSIC语言... 查看详情

校招面试之终结篇

...的含义++i和i++volatile的理解synchronized是阻塞式同步hashCode和equal的区别和联系常见异常有哪些,遇到异常怎么处理JVM类加载机制JVM垃圾如何回 查看详情

死磕spring之aop篇

...AOP源码之前,需要对SpringIoC有一定的了解,可查看我的《死磕Spring之IoC篇-文章导读》这一系列文章了解AOP相关术语,可先查看《SpringAOP常见面试题 查看详情

死磕springaop系列4:剖析aopschema方式原理

这个是《死磕SpringAOP系列》第4个。已经讲过的内容死磕SpringAOP系列3:剖析Bean处理器之DefaultAdvisorAutoProxyCreator死磕SpringAOP系列2:剖析Bean处理器之BeanNameAutoProxyCreator死磕SpringAOP系列1:编程式实现AOP通过前3篇,大家应该可以清楚... 查看详情

瞻博-juniper-ssg系列之pbr(策略路由)配置终结篇

...给大家分享的一个配置实例是30岁左右的网工非常喜欢的系列,Juniper-SSG 查看详情

java并发编程专题系列之深入分析synchronized(基础篇)

synchronized同步关键字简介synchronized是属于JVM层面的一个关键字,底层是通过一个monitor对象(管程对象)来完成,由于wait()/notify()等方法也依赖于monitor对象,所以只有在同步的块或者方法中才能调用wait/notify等方法synchronized同步代码... 查看详情