一、HashTable
源码结构大致与HashTable相同,不同的地方是对数据进行读取操作的方法都加上了synchronized
二、ConcurrentHashMap 则使用了 ReentrantLock 来解决并发问题。
三、java.util.concurrent.locks.ReentrantLock分析
其代码结构大致如下:
public class ReentrantLock implements Lock{
private final Sync sync;
static abstract class Sync extends AbstractQueuedSynchronizer{
private volative int state; (AbstractQueuedSynchronizer中定义的变量)
final boolean nofairTryAcquire(int acquires);
protected final boolean tryRelease(int releases);
...
}
final static class NonfairSync extends Sync;
final static class FairSync extends Sync;
...
}
摘取其中两段代码:
final boolean nofairTryAcquire(int acquires) {
protected final booleantryRelease(int releases) {
// getExclusiveOwnerThread()方法虽然读取了共享变量,但是不需要使用CAS方法,这是因为 getExclusiveOwnerThread()的Thread可能会改变,但是怎么都不会改变 Thread.currentThread() != getExclusiveOwnerThread()的值,因为currentThread在此行无法改变ExclusiveOwnerThread是否是自己。
至于 fairTryAcquire 与 nofairTryAcquire的不同,主要在与获取锁的条件判断上,除了
compareAndSetState(0,acquires)判断state是否为0外,多了一个条件 !hasQueuedPredecessors();