Python 官方文档:入门教程 => 点击学习
目录什么是AQSAQS原理利用AQS实现自定义锁一:首先创建一个类实现Lock接口,它有6个方法需要实现二:创建一个内部类,继承AbstractQueuedSynchronizer三
AQS(AbstractQueuedSynchronizer),中文名抽象队列同步器
AQS 核心思想:
实现核心思想的的队列:CLH队列
CLH队列是一个虚拟的双向队列,AQS 是将每条请求共享资源的线程封装成一个 CLH 锁队列的一个结点(node)来实现锁的分配。
共享资源用 volatile 关键词修饰,保证线程间的可见性
private volatile int state;
0状态表示空闲,1状态或以上表示不空闲
共享资源(state)的访问方式有三种:
源代码如下
protected final int getState() {
return state;
}
protected final void setState(int newState) {
state = newState;
}
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapint(this, stateOffset, expect, update);
}
可以根据需求重写具体方法,总共有5种方法
分析
具体代码如下
//自定义锁(不可重入)(独占锁)(条件变量)
class MyLock implements Lock{
//内部类,AQS同步器类
class MySync extends AbstractQueuedSynchronizer{
@Override
protected boolean tryAcquire(int arg) {
if (compareAndSetState(0,1)){
System.out.println("获得锁成功");
//加上了锁,并设置owner为当前线程
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
System.out.println("获得锁失败");
return false;
}
@Override
protected boolean tryRelease(int arg) {
setExclusiveOwnerThread(null);
setState(0);
return true;
}
@Override
protected boolean isHeldExclusively() {
return getState() == 1;
}
public Condition newCondition(){
return new ConditionObject();
}
}
private MySync mySync = new MySync();
@Override //加锁(不成功进入阻塞队列等待)
public void lock() {
mySync.acquire(1);
}
@Override //加锁可打断
public void lockInterruptibly() throws InterruptedException {
mySync.acquireInterruptibly(1);
}
@Override //加锁(不成功不会进入阻塞队列等待,可以去做其他事情)
public boolean tryLock() {
return mySync.tryAcquire(1);
}
@Override //尝试加锁 带时间
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return mySync.tryAcquireNanos(1,unit.toNanos(time));
}
@Override //释放锁
public void unlock() {
mySync.release(1);
}
@Override //创建条件变量
public Condition newCondition() {
return mySync.newCondition();
}
}
到此这篇关于Java利用AQS实现自定义锁的文章就介绍到这了,更多相关Java AQS实现自定义锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Java利用AQS实现自定义锁
本文链接: https://www.lsjlt.com/news/165180.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0