状态位
- 前16读锁,后16写锁;
- 获取读锁左移16,获取写锁:当前状态 & 2^16-1
写锁获取资源:
- 资源已被获取:不是读锁获取的 && 本线程获取的 && 锁状态不大于 2^16;
- 资源未被获取:不需要写阻塞;CAS设置状态成功
读锁获取资源:
写锁不存在或存在的是当前线程的写锁;不需要读阻塞;CAS设置状态成功;
锁降级:
一开始获取读锁,状态:65536;再获取了写锁,状态:65537;最后释放了写锁,状态:65536,变成了读锁;
锁饥饿:
- 非公平读锁获取锁阻塞时,如果首位是写锁,则阻塞当前读线程,只针对新的读线程(通过ThreadLocal的count数量判断);
- 并不能解决,如果首位是读锁,下一个是写锁,下一个也同样可能被阻塞。可参考StampedLock;