gpt4 book ai didi

java - 用Java编写一次一次的锁

转载 作者:太空宇宙 更新时间:2023-11-04 09:00:07 25 4
gpt4 key购买 nike

我正在尝试实现一个 Java 锁类型的东西,它执行以下操作:

  1. 默认情况下,线程不传递锁。 (与普通锁相反,只要不持有锁就可以获取锁。)
  2. 如果只有一个线程正在等待锁,则该线程中的执行将停止
  3. 如果有多个线程正在等待锁,则允许等待时间最长的线程继续执行。

我正在努力在 AbstractQueuedSynchronizer 之上实现这一点。允许最旧线程通过的转换如下所示:

//inner class inside Lock
private static class Sync extends AbstractQueuedSynchronizer {
public Sync(){
setState(-1);
}

public boolean tryAcquire(int ignore) {
if (getState() == 1) return false;

Thread first = getFirstQueuedThread();
if (first != null &&
first != Thread.currentThread()) {
setState(0);
return false;
}
return compareAndSetState(0, 1);

我看到的问题是,当我调用 setState(0) 但返回 false 时,Sync 对象永远不会再次让第一个线程 tryAcquire。我需要使用共享模式吗?这个问题有更好的解决办法吗?

这是我所谓的“Valve”实现的一部分,我想将其用于长轮询 AJAX 响应。我有一个线程等待阀门变得“加压”的部分——有数据要发送到客户端),但释放最旧的线程似乎很难,除非我不使用 AbstractQueuedSynchronizer,而且我真的不想编写一个全面的锁实现。

最佳答案

看看 ReentrantLock 类 ( http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html )。

您可以将此锁对象保留为类中的私有(private)变量,并使用它来执行您需要执行的任何操作。我不太确定在不了解代码的情况下如何实现这一点,但是这个 Lock 对象具有提供您在帖子中提到的行为所需的所有方法。

要跟踪线程等待的时间,您可能需要将某些内容组合在一起才能跟踪它。我不认为 Thread 类提供这种功能。

关于java - 用Java编写一次一次的锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/936113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com