当前位置: 首页 > wzjs >正文

网站建设一年多少恰高端网站建设团队

网站建设一年多少恰,高端网站建设团队,开发 app,企业建设网站的帮助一、ReentrantLock 简介 ReentrantLock 是 Java 并发包 java.util.concurrent.locks 中的一个可重入的互斥锁,提供了比内置锁(synchronized)更灵活的锁操作。它支持公平锁和非公平锁两种模式,并且可以尝试非阻塞地获取锁、尝试获…

一、ReentrantLock 简介

ReentrantLock 是 Java 并发包 java.util.concurrent.locks 中的一个可重入的互斥锁,提供了比内置锁(synchronized)更灵活的锁操作。它支持公平锁和非公平锁两种模式,并且可以尝试非阻塞地获取锁、尝试获取锁并指定等待时间等操作。

二、公平锁与非公平锁的区别

1. 非公平锁(NonfairSync)

非公平锁允许插队,可能会导致某些线程长期等待。非公平锁的 lock() 方法首先尝试通过 CAS 直接获取锁,如果失败则进入 AQS 的 acquire 方法。

final void lock() {if (compareAndSetState(0, 1)) { // 尝试通过 CAS 获取锁setExclusiveOwnerThread(Thread.currentThread());} else {acquire(1); // 如果 CAS 失败,进入 AQS 的 acquire 方法}
}

2. 公平锁(FairSync)

公平锁按照 FIFO 顺序获取锁,保证线程的公平性。公平锁的 lock() 方法直接调用 AQS 的 acquire 方法,不会尝试直接获取锁。

final void lock() {acquire(1); // 直接进入 AQS 的 acquire 方法
}

三、hasQueuedPredecessors 方法解析

hasQueuedPredecessors 方法是公平锁实现的核心,用于检查队列中是否有等待执行的线程。如果队列中有等待线程,则当前线程不能直接获取锁,必须排队等待。

public final boolean hasQueuedPredecessors() {Node t = tail; // 获取尾节点Node h = head; // 获取头节点Node s;return h != t && // 如果头尾不一致,说明队列中有节点((s = h.next) == null || s.thread != Thread.currentThread()); // 检查头节点的下一个节点是否为当前线程
}
  • h != t:判断队列是否为空。如果头尾节点不一致,说明队列中有等待线程。

  • s.thread != Thread.currentThread():检查头节点的下一个节点是否为当前线程。如果不是,说明有其他线程在队列中等待。

四、公平锁与非公平锁的实现细节

1. 公平锁的 tryAcquire 方法

公平锁在尝试获取锁之前,会先调用 hasQueuedPredecessors 方法检查队列中是否有等待线程。

protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {if (!hasQueuedPredecessors() && // 检查队列中是否有等待线程compareAndSetState(0, acquires)) { // 如果没有等待线程,尝试获取锁setExclusiveOwnerThread(current);return true;}} else if (current == getExclusiveOwnerThread()) { // 可重入逻辑int nextc = c + acquires;if (nextc < 0)throw new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;
}

2. 非公平锁的 tryAcquire 方法

非公平锁直接尝试通过 CAS 获取锁,不会检查队列。

protected final boolean tryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0 && compareAndSetState(0, acquires)) { // 直接尝试获取锁setExclusiveOwnerThread(current);return true;}return false;
}

五、lockInterruptibly 方法

lockInterruptibly 方法尝试获取锁,但如果当前线程被中断,则抛出 InterruptedException

public void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);
}
  • acquireInterruptibly:AQS 的方法,尝试获取锁。如果线程被中断,则抛出 InterruptedException

使用场景

适用于需要响应中断的场景,例如在任务被取消时能够及时释放资源。

示例代码

ReentrantLock lock = new ReentrantLock();
try {lock.lockInterruptibly();// 执行需要同步的代码
} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 处理中断
} finally {lock.unlock(); // 确保释放锁
}

六、tryLock 方法

tryLock 方法尝试获取锁,但不会阻塞。如果锁立即可用,则返回 true,否则返回 false

public boolean tryLock() {return sync.nonfairTryAcquire(1);
}
  • nonfairTryAcquire:尝试获取锁,不会检查队列。

使用场景

适用于需要尝试获取锁但不希望阻塞的场景,例如在高并发环境下避免线程长时间等待。

示例代码

ReentrantLock lock = new ReentrantLock();
if (lock.tryLock()) {try {// 执行需要同步的代码} finally {lock.unlock(); // 确保释放锁}
} else {// 锁不可用,执行其他逻辑
}

tryLock 方法还有一个重载版本,允许指定等待时间:

public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {return sync.tryAcquireNanos(1, unit.toNanos(timeout));
}
  • tryAcquireNanos:尝试在指定时间内获取锁。如果在指定时间内获取到锁,则返回 true,否则返回 false

示例代码

ReentrantLock lock = new ReentrantLock();
try {if (lock.tryLock(1, TimeUnit.SECONDS)) {try {// 执行需要同步的代码} finally {lock.unlock(); // 确保释放锁}} else {// 锁不可用,执行其他逻辑}
} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 处理中断
}

七、unlock 方法

unlock 方法释放锁。如果当前线程不是锁的持有者,则抛出 IllegalMonitorStateException

public void unlock() {sync.release(1);
}
  • release:AQS 的方法,尝试释放锁。

使用场景

在使用 locklockInterruptiblytryLock 方法获取锁后,必须在 finally 块中调用 unlock 方法,以确保锁被正确释放,避免死锁。

示例代码

ReentrantLock lock = new ReentrantLock();
lock.lock();
try {// 执行需要同步的代码
} finally {lock.unlock(); // 确保释放锁
}

八、总结

  • 非公平锁:先尝试通过 CAS 抢锁,抢不到再排队。这种方式可能会导致某些线程长期等待,但吞吐量较高。

  • 公平锁:不会尝试直接获取锁,而是先检查队列中是否有等待线程,只有队首线程才允许尝试获取锁。这种方式保证了线程的公平性,但可能会导致吞吐量较低。

在实际使用中,可以根据具体需求选择公平锁或非公平锁。如果对响应时间要求较高,建议使用非公平锁;如果需要保证线程的公平性,建议使用公平锁。

ReentrantLock 提供了多种方法来控制锁的行为,包括尝试获取锁、尝试获取锁并指定超时时间、检查锁的状态等。这些方法的实现都基于 AQS 的核心机制,通过 tryAcquiretryReleaseacquirerelease 等方法来实现锁的获取和释放。


文章转载自:

http://OQ4oYN6W.dnphd.cn
http://lKyAAsu5.dnphd.cn
http://bVwcbXvw.dnphd.cn
http://tIRmrjXf.dnphd.cn
http://m56wnmeO.dnphd.cn
http://mfCul201.dnphd.cn
http://CqaCcf8G.dnphd.cn
http://AWzlHtwt.dnphd.cn
http://Wbb8R4dH.dnphd.cn
http://YHdrdEjT.dnphd.cn
http://3HR9b3gF.dnphd.cn
http://ps7jhbmR.dnphd.cn
http://hbog4aof.dnphd.cn
http://kFs8n0Gb.dnphd.cn
http://SJnNkj8O.dnphd.cn
http://daA1XaRr.dnphd.cn
http://OBc1ucEB.dnphd.cn
http://smzY3RZ1.dnphd.cn
http://vQ5lZZuB.dnphd.cn
http://XXLqgSw7.dnphd.cn
http://hNZlBMNT.dnphd.cn
http://Hf9K3PKd.dnphd.cn
http://grXSrNVK.dnphd.cn
http://OOqDqTJR.dnphd.cn
http://VXY0HDD4.dnphd.cn
http://i2lLQY8M.dnphd.cn
http://92X2dj9L.dnphd.cn
http://sffUxqp7.dnphd.cn
http://1NBiEUH8.dnphd.cn
http://OqDjvn9S.dnphd.cn
http://www.dtcms.com/wzjs/732456.html

相关文章:

  • 重庆巴南网站建设类似织梦的建站cms
  • 成都大丰网站建设例表网国家住房和城乡建设部官网
  • 哪些网站是做采购的如何做网站内容管理
  • 软件外包专业成都网站排名优化开发
  • 青年人爱看的网站惠州手工外发加工网
  • wordpress+三主题公园seo如何提高排名
  • 初级买题做哪个网站好wordpress编辑器位置
  • 优化学校网站建设方案利津网站定制
  • 北京建网站公司域名备案 没有网站吗
  • 2019做什么类型网站asp网站表格代码
  • 淮安公司做网站国外做彩票网站推广是合法的吗
  • 关于重新建设网站的申请表初中文凭怎么自考大专
  • 手机网站建设视频教程python小程序代码
  • 网站开发教程百度云哪个公司做网站便宜
  • 外贸在什么网站做织梦网站栏目建设
  • 网站防红链接怎么做的网站建设推广代理公司
  • 靖江建设行业协会网站营销网站建设计划书
  • 英文购物网站模板wordpress模版如何套用
  • 泉州网站制作平台怎么自己做网站赚钱
  • 如何查询网站的访问量seo诊断服务
  • 东营网站制作公司西安建设网站的公司简介
  • 龙华网站建设销售员市场营销策划案的范文
  • 做网站有什么注意事项新手怎样做网络营销推广
  • 微信开发网站开发未来前景阳春网站制作
  • 网站建设51cto技术支持 昆明网站建设
  • 房产网站建设产品网站开发用什么写得比较好
  • 铜仁建设局网站首页长沙制作手机网站
  • 聊城网站建设公司电话三五互联网站后台
  • wap搜索引擎宁波正规seo推广公司
  • 网站建设支付宝网站制作哪家专业