reentrantLock源码分析

来源:互联网 发布:知乎最高赞 编辑:程序博客网 时间:2024/06/04 20:29
import java.util.concurrent.locks.ReentrantLock;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.LockSupport;


/**
 * reentrantLock 内部类,Sync extends abstractQueuedSynchronizer,之后使用Sync,ReentrantLock 有NonfairSync、fairSync实现公平锁。
 * reentrantLock 默认创建NonfairSync,lock.lock() 实际调用sync的acquire方法()。acquire方法调用tryAcquire方法,tryAcquire成功,执行setExclusiveOwnerThread(current);,否则tryAcquire方法失败,调用acquireQueued(addWaiter 将获取当前线程Thread.currentThread()(返回Thread线程对象)封装入Node,将Node加入enq(node)队列中),tryAcquire由容器继承AQS自己实现。
 * 避免每个容器有相同的tryAcquire方法,避免子类实现所有接口。
 * tryAcquire , tryRelease,如果成功,执行unparkSuccessor,阻塞激活queue中Node中的线程。LockSupport.unpark(s.thread);,如果当前线程不是持有锁的线程Thread.currentThread() != getExclusiveOwnerThread()
 * @author pc
 *
 */
public class ReeetrantLockCode {
static ReentrantLock lock = new ReentrantLock();

public static void main(String[] args){
lock.lock();
lock.unlock();
final List<Thread> list = new ArrayList<Thread>();
System.out.println(Thread.currentThread());
new Thread(new Runnable(){
public void run(){
list.add(Thread.currentThread());
LockSupport.park(this);// 阻塞当前线程,AQS设计方式,将当前线程放入阻塞队列中。
System.out.println("2");
}
}).start();
try {
Thread.sleep(1000);
LockSupport.unpark(list.get(0)); // 释放获取锁的线程
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 商铺没有下水道怎么办 商铺没有上下水怎么办 绩效工资离职时怎么办 超市收银多钱怎么办 收银老是少钱怎么办 收银少钱了怎么办 呼伦贝尔负地接怎么办 冰箱平放运输了怎么办 苹果手机网站打不开怎么办 微卡怎么办货运资格证 58速运接不到单怎么办 公司亏损小股东怎么办 中铁七局拖欠农民工工资怎么办 感冒坐车耳鸣了怎么办 过隧道耳朵疼怎么办 动车耳朵不舒服怎么办 感冒坐高铁耳朵疼怎么办 坐火车耳朵难受怎么办 高铁耳朵胀痛怎么办 坐火车耳膜疼怎么办 去朝鲜的护照怎么办 朝鲜自由行签证怎么办 德国签证拒签怎么办 德签申诉不成功怎么办 出国工作找对象怎么办 白色轿车有刮痕怎么办 办签证手机钱包怎么办 怎么办美国10年签证 我没有出生证明怎么办 去台湾探亲怎么办签证 漏接澳大利亚签证电话怎么办 冰岛游公证认证怎么办 莲蓬头开关坏了怎么办 淋浴莲蓬头坏了怎么办 手机ld密码忘掉怎么办 脊椎压迫神经头晕怎么办 脊椎疼导致头晕怎么办 脊椎疼引起头晕怎么办 去英国探亲签证怎么办 地税国税合并人员怎么办 机场服务员老了怎么办