美文网首页
ReentrantLock原理

ReentrantLock原理

作者: couriravant | 来源:发表于2019-12-23 17:24 被阅读0次

    公平锁原理:

    A、B两个线程同时执行lock()方法获取锁,假设A先执行获取到锁,此时state值加1,如果线程A在继续执行的过程中又执行了lock()方法,线程A会直接获取锁,同时state值加1,state的值可以简单理解为线程A执行lock()方法的次数;当线程B执行lock()方法获取锁时,会将线程B封装成Node节点,并将其插入到同步等待队列的尾部,然后阻塞当前线程,等待被唤醒再次尝试获取锁;线程A每次执行unlock()方法都会将state值减1,直到state的值等于零则表示完全释放掉了线程A持有的锁,此时将从同步等待队列的头节点开始唤醒阻塞的线程,阻塞线程恢复执行,再次尝试获取锁。ReentrantLock公平锁的实现使用了AQS的同步等待队列和state。

     static final class FairSync extends ReentrantLock.Sync {
            private static final long serialVersionUID = -3000897897090466540L;
    
            FairSync() {
            }
    
            final void lock() {
                this.acquire(1);
            }
          。。。
    

    非公平锁性能高于公平锁性能的原因:

    在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。

    非公平锁:

    static final class NonfairSync extends Sync {
            private static final long serialVersionUID = 7316153563782823691L;
    
            final void lock() {
                //利用CAS判断锁线程是否有锁,如果没有则直接抢占
                if (compareAndSetState(0, 1))
                    setExclusiveOwnerThread(Thread.currentThread());
                else
                    acquire(1);
            }
    
            protected final boolean tryAcquire(int acquires) {
                return nonfairTryAcquire(acquires);
            }
        }
    

    CAS原理:https://maoyunfei.github.io/java/64788dff/

    相关文章

      网友评论

          本文标题:ReentrantLock原理

          本文链接:https://www.haomeiwen.com/subject/cjzznctx.html