单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。
SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
在最开始的时候,synchronized其实就是无锁直接到重量级锁,但是重量级锁需要向内核申请额外的锁资源,这就涉及到用户态和内核态的转换,比较浪费资源,而且大多数情况下,其实还是一个线程去争抢锁,完全不需要重量级锁,synchronized其实是优化过的synchronized。
其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6后,Jvm为了提高锁的获取与释放效率对(synchronized )进行了优化,引入了 偏向锁 和 轻量级锁 ,从此以后锁的状态就有了四种(无锁、偏向锁、轻量级锁、重量级锁
),并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级。
本文先介绍synchronized锁升级之无锁和偏向锁,后续详细介绍下synchronized锁升级过程。
volatile是Java中的关键字,用来修饰会被不同线程访问和修改的变量。JMM(Java内存模型)是围绕并发过程中如何处理可见性、原子性和有序性
这3个特征建立起来的,而volatile可以保证其中的两个特性。
volatile是Java虚拟机提供的轻量级同步机制。
你知道它的工作原理吗?
很多同学估计都对AQS有一种云里雾里的感觉,如果用搜索引擎查一下AQS是什么?看几篇文章,估计就直接放弃了,因为密密麻麻的文字,实在是看不懂!
所以,基于上述痛点,咱们这篇文章,就用最简单的大白话配合N多张手绘图,给大家讲清楚AQS到底是什么?让各位同学面试被问到这个问题时,不至于不知所措。
中途如果遇到疑问的地方,建议使用 chatgpt
进行提问答疑,毕竟这玩意确实牛批。
这篇文章是 AQS 系列的最后一篇,第一篇,我们通过 ReentrantLock 公平锁分析了 AQS 的核心,第二篇的重点是把 Condition 说明白,同时也说清楚了对于线程中断的使用。
这篇,我们的关注点是 AQS 最后的部分,AQS 共享模式
的使用。有前两篇文章的铺垫,剩下的源码分析将会简单很多。
本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier、Semaphore 的源码一起过一下。
相对来说,如果读者有前面两篇文章的基础,这篇文章是简单很多,不过对于初学者来说,1 小时估计也是免不了的。
本文关注以下几点内容:
其实这篇文章的信息量很大,初学者估计至少要1小时
才能看完,希望本文对得起大家的时间。
AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是 Java 并发包的基础工具类,是实现 ReentrantLock、CountDownLatch、Semaphore、FutureTask 等类的基础。