见网址:
http://www.cnblogs.com/skywang12345/p/3505809.html
可以拿 共享锁和原来的独占锁 比较:
ReentrantReadWriteLock中的 WriteLock 是独占锁, ReentrantLock 也是独占锁,
他们的源码在获取锁上面 是一致的:
ReentrantLock
public class ReentrantLock implements Lock, java.io.Serializable {
public void lock() {
sync.lock();
}
final void lock() {
acquire(1);
}
AbstractQueuedSynchronizer 的
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
public static class WriteLock implements Lock, java.io.Serializable {
public boolean tryLock( ) {
return sync.tryWriteLock();
}
public void lock() {
sync.acquire(1);
}
另外通过 网址 http://www.cnblogs.com/skywang12345/p/3505809.html
的样例,可以看到
myLock.readLock().lock(); 使用读 共享锁, 多个线程可以一起执行读操作;
使用写 独占锁,各个线程之间是 互相阻塞的。
读写也是 互斥的, 因为当一个 写线程 获取到 写锁之后,其他的读线程 就没有办法获取到读锁了, 导致读的代码 被阻塞执行了。
继续看以下 三个样例,加深对 共享锁的认识:
09. Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例
10. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例
11. Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例
共享锁和独占锁 释放的区别
在类AbstractQueuedSynchronizer 中 对比
共享锁和独占锁 的各个方法的区别。