【问题标题】:Subsequent acquires on semaphore on the same thread随后在同一线程上获取信号量
【发布时间】:2017-11-28 03:04:43
【问题描述】:

我正在尝试使用信号量将线程锁定几秒钟,然后它才会放弃尝试获取锁定并继续。问题是,我认为信号量实际上并没有锁定任何东西。这是我正在尝试做的事情:

Semaphore lock = new Semaphore(1)
lock.acquire();

//Wait until some other thread releases the lock, or until the timeout
lock.tryAcquire(WAIT_INTERVAL, TimeUnit.MILLISECONDS);

//do whatever

我认为问题是:如果线程已经获得锁,尝试从同一个线程获取两次并不会阻止线程运行。但我不确定。是这样吗?

谢谢大家。

【问题讨论】:

  • 无法复制。奇怪的方式来阻止你自己的线程。你在找Thread.sleep()吗?

标签: java multithreading semaphore


【解决方案1】:

解释代码中发生的事情

  1. lock.acquire(); 从这个信号量获取一个许可,阻塞直到有一个可用。由于您只是尝试获取并且有 1 个可用许可,因此它将立即获取。

  2. lock.tryAcquire(WAIT_INTERVAL, TimeUnit.MILLISECONDS); 因为已经获得了 1 个许可(来自上一行代码),所以在有人释放锁之前永远不会获得锁。所以它会等待/阻塞直到超时我的意思是WAIT_INTERVAL时间过去了。如果获得许可,则此方法返回booleantrue,如果在获得许可之前经过了等待时间,则返回false。所以它显然会返回false

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2017-03-11
    • 2019-01-27
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多