Java并发包中共享锁的实现原理

共享锁--用到共享锁的有Semapore信号量和ReadLock读锁

共享式获取和独占式获取最主要的区别就是:在同一时刻能否有多个线程同时获取到同步状态。

下面我们分析下源码:

我们以Semaphore为例。Semaphore是信号量,---作用就是一个共享资源,他可以控制同时多少个线程同时访问该资源。

【信号量用于控制某个资源可被同时访问的个数,信号量维护一个许可集-----》访问共享实例前,会阻塞每个线程的访问,获取到该许可之后才可以进入访问】

如源码:


Semaphore---->acquire(permits)---------默认非公平获取

如图:

如果没有获取到,就会放到同步队列里;



tryAxquire():尝试获取共享锁:



如果我们调用的是acquire()方法,当我们没有获取到许可的时候,我们就会将当前线程放到同步队列中

下面的图和上面的其实是一个,上面是响应中断的,下面是不响应中断的


doAcquireSharedInterruptibly实现如下:


不响应中断的:


上图并不响应中断,截图里说的有点出入。希望注意。


上图的doReleaseShared释放:


---------------------------------------------------------------------------------------------------------------------------------------------------------------

这里释放并只需要将状态减去相应的许可数值。


猜你喜欢

转载自blog.csdn.net/try_harder_every_day/article/details/80021530