一、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();
本文详细解读了Java并发锁机制中的ReentrantLock类的源码实现,包括其内部结构、关键方法以及公平与非公平锁的区别。通过深入分析ReentrantLock的源码,揭示了其如何解决并发问题并确保线程安全。
1242

被折叠的 条评论
为什么被折叠?



