本来是看ConcurrentHashMap的,但是里面用到了ReentrantLock。以前只知道这是可重入锁,但是具体啥意思不懂。今天看了许多文档,但是都是底层代码解析,一个线程获取锁,再次获取锁。我很纳闷为啥拿到了,还要再拿。直到看了可算清楚这是什么意思了。
- 可重入:文中形象的把线程当做一个排队取水的人,取水规则允许此人的家人不排队直接取水,其他人取水就在后面排队形成排队队列。当他的家人来取水的时候就是相当于重入了,直接将正在取水人数+1,取完水对取水人数-1。直到取水人数为零时,排队在队列队头的人准备开始取水。
- 公平和非公平:ReentrantLock实现了Lock接口,因此实现了其中的lock(),方法中调用了sync.lock();中还有一个是否为公平的参数,sync是在ReentrantLock的构造函数中实现的。其中fair参数的不同可实现公平锁和非公平锁。
- 公平模式就是来人就要进行排队。
- 非公平就是来人看看有人取水没,没人取水,看着队列头的人正准备取水呢,他直接跑过去抢了,结果他抢到了,队列头的人继续排队。(这种人好无理啊!就这个意思。)