• ReentrantLock 锁释放源码分析


    ReentrantLock 锁释放源码分析:

    调用的是unlock 的方法:

    public void unlock() {

            sync.release(1); 

    }

    接下来分析release() 方法:

    public final boolean release(int arg) {   // arg=1

            if (tryRelease(arg)) {         //独占锁是否被释放  当state=0时为true

                Node h = head;  

                if (h != null && h.waitStatus != 0)

                    unparkSuccessor(h);

                return true;

            }

            return false;

        }

    接下来分析tryRelease()方法:

    protected final boolean tryRelease(int releases) {  // releases=1

                int c = getState() - releases;        //getState()

                if (Thread.currentThread() != getExclusiveOwnerThread())  //当前执行线程线程是否是独占锁持有线程

                    throw new IllegalMonitorStateException();

                boolean free = false;

                if (c == 0) {  // 该线程持有锁的次数已经全部被释放了

                    free = true;

                    setExclusiveOwnerThread(null);  //设置独占锁的持有线程为null

                }

                setState(c);  //设置设置加锁次数为c

                return free;  //返回独占锁是否被释放了;

            }

     下面分析 unparkSuccessor(h); 这个方法:

    private void unparkSuccessor(Node node) {   //node =head  表头

           

            int ws = node.waitStatus;  //  表头等待状态

            if (ws < 0)      

                compareAndSetWaitStatus(node, ws, 0);

            Node s = node.next;   //后继节点

            if (s == null || s.waitStatus > 0) {

                s = null;

                for (Node t = tail; t != null && t != node; t = t.prev)

                    if (t.waitStatus <= 0)

                        s = t;

            }

            if (s != null)

                LockSupport.unpark(s.thread);

        }

    这个方法的作用是唤醒下一个等待线程;

  • 相关阅读:
    docker安装和hub
    sql获取时间、年龄
    在eclipse中配置Tomcat时,出现“Cannot create a server using the selected type”的错误。
    ajax简单做html查询删除(鲜花)
    java使用jsp建立项目+视频
    java根据数据库自动生成代码
    java连接数据库增删改查公共方法
    制作二维码java
    富文本编译器
    java字符串类型和时间类型的转换
  • 原文地址:https://www.cnblogs.com/beppezhang/p/11214683.html
Copyright © 2020-2023  润新知