【问题标题】:ReentrantLock shared by threads not seeming to honor lock线程共享的 ReentrantLock 似乎不支持锁
【发布时间】:2014-01-12 23:46:41
【问题描述】:

我有一个在线程之间共享的 ReentrantLock 对象,但我可以通过不同的线程锁定同一个对象。这似乎不对,因为它们是不同的线程。这是截断/简化的输出:

11:04:47,136 [http-bio-8080-exec-9] INFO  CamTask  - ABOUT TO LOCK..... java.util.concurrent.locks.ReentrantLock@4462cf1d[Unlocked] -- 0
11:04:47,136 [http-bio-8080-exec-9] INFO  CamTask  - GOT LOCK java.util.concurrent.locks.ReentrantLock@4462cf1d[Locked by thread http-bio-8080-exec-9] -- 1
// ...     //
11:04:48,244 [Camel thread #1] INFO  MyProcessor  - ABOUT TO LOCK... java.util.concurrent.locks.ReentrantLock@4462cf1d[Unlocked] -- 0
11:04:48,245 [Camel thread #1] INFO  MyProcessor  - GOT LOCK java.util.concurrent.locks.ReentrantLock@4462cf1d[Locked by thread Camel thread #1] -- 1
// ...     //
11:04:48,280 [Camel thread #1] INFO  MyProcessor  - ABOUT TO UNLOCK.. java.util.concurrent.locks.ReentrantLock@4462cf1d[Locked by thread Camel thread #1] -- 1
11:04:48,280 [Camel thread #1] INFO  MyProcessor  - UNLOCKED. java.util.concurrent.locks.ReentrantLock@4462cf1d[Unlocked] -- 0
// ...     //
11:04:48,284 [http-bio-8080-exec-9] INFO  CamTask  - ABOUT TO UNLOCK..... java.util.concurrent.locks.ReentrantLock@4462cf1d[Locked by thread http-bio-8080-exec-9] -- 1
11:04:48,284 [http-bio-8080-exec-9] INFO  CamTask  - UNLOCKED. java.util.concurrent.locks.ReentrantLock@4462cf1d[Unlocked] -- 0

我的日志结构如下:

log.info("ABOUT TO LOCK.. "+lock+" -- "+lock.getHoldCount());
lock.lock();
log.info("GOT LOCK "+lock+" -- "+lock.getHoldCount());

如你所见:

  1. [http-bio-8080-exec-9] 锁定(按预期锁定后保持计数为 0,然后为 1)
  2. [Camel thread #1] 锁定(为什么会出现这种情况,因为 [http-bio-8080-exec-9] 尚未解锁?

MyProcessor 在消息到达队列时被调用。 lock 对象在其构造函数中传递给 MyProcessor。当我在上面的日志中打印出锁定对象时,您可以看到它是同一个对象(具有相同的引用 ID)。

有什么想法吗?

谢谢!

【问题讨论】:

  • 您的锁很可能比您想象的要多。
  • @Peter 看起来像同一个对象ReentrantLock@4462cf1dReentrantLock 是否有类似 Semaphore 的计数器?我不这么认为。
  • 你确定你没有错过日志中的一些解锁。
  • 根据您的日志记录设置方式,可能会实际兑现锁,但日志记录可能出现故障。相关日志消息之间似乎只经过了 1/50 秒。
  • 您可能正在使用异步记录器吗?

标签: java multithreading locking reentrantlock


【解决方案1】:

感谢大家的cmets。根据异步日志记录和日志记录排序的建议,我添加了一些睡眠来找出答案。添加睡眠后,锁定按预期等待,所以我认为日志记录只是乱序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 2021-09-23
    • 2018-03-20
    • 1970-01-01
    • 2014-01-07
    • 2018-03-10
    • 2012-06-02
    • 2020-07-17
    相关资源
    最近更新 更多