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();
}
}
}
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();
}
}
}
阅读全文
0 0
- ReentrantLock 源码分析
- java ReentrantLock源码分析
- ReentrantLock源码分析
- JUC - ReentrantLock 源码分析
- ReentrantLock 源码分析
- ReentrantLock 源码分析
- ReentrantLock源码分析(一)
- ReentrantLock源码分析(二)
- ReentrantLock源码分析(三)
- ReentrantLock源码分析
- reentrantLock源码分析
- ReentrantLock源码分析
- Java并发-ReentrantLock源码分析
- java并发-ReentrantLock源码分析
- ReentrantLock源码分析(JDK 1.7)
- java并发-ReentrantLock源码分析
- java源码分析:重入锁ReentrantLock
- ReentrantLock源码分析与理解
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)
- git常用语句
- char* 转 LPCWSTR 解决方案
- 92-reverse linked list II
- #树与二叉树#
- reentrantLock源码分析
- Cookie跨域setDomain前面要加点儿
- 不限制内存用桶排序PHP
- 字符串转化为整数
- linux 中Telnet 服务器 的搭建
- 【ML】多项式回归
- 关于约束布局Constraintlayout
- CNNIC发布报告:全球中文钓鱼网站.COM域名排名第一
- spring hibernate 单元测试手动开启关闭session