共享锁--用到共享锁的有Semapore信号量和ReadLock读锁
共享式获取和独占式获取最主要的区别就是:在同一时刻能否有多个线程同时获取到同步状态。
下面我们分析下源码:
我们以Semaphore为例。Semaphore是信号量,---作用就是一个共享资源,他可以控制同时多少个线程同时访问该资源。
【信号量用于控制某个资源可被同时访问的个数,信号量维护一个许可集-----》访问共享实例前,会阻塞每个线程的访问,获取到该许可之后才可以进入访问】
如源码:
Semaphore---->acquire(permits)---------默认非公平获取
如图:
如果没有获取到,就会放到同步队列里;
tryAxquire():尝试获取共享锁:
如果我们调用的是acquire()方法,当我们没有获取到许可的时候,我们就会将当前线程放到同步队列中
下面的图和上面的其实是一个,上面是响应中断的,下面是不响应中断的
doAcquireSharedInterruptibly实现如下:
不响应中断的:
上图并不响应中断,截图里说的有点出入。希望注意。
上图的doReleaseShared释放:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
这里释放并只需要将状态减去相应的许可数值。