Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程共享的ReentrantLock似乎不尊重锁_Java_Multithreading_Locking_Reentrantlock - Fatal编程技术网

Java 线程共享的ReentrantLock似乎不尊重锁

Java 线程共享的ReentrantLock似乎不尊重锁,java,multithreading,locking,reentrantlock,Java,Multithreading,Locking,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 C

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

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());
如你所见:

  • [http-bio-8080-exec-9]锁定(如预期,锁定后的保持计数为0然后为1)
  • [Camel-thread#1]锁(既然[http-bio-8080-exec-9]还没有解锁,为什么这是可能的?)
  • 当消息到达队列时,将调用MyProcessor。
    lock
    对象在其构造函数中传递给MyProcessor。当我在上面的日志中打印出锁对象时,您可以看到它是同一个对象(具有相同的引用ID)

    有什么想法吗


    谢谢

    谢谢大家的评论。根据异步日志和日志排序的建议,我添加了一些睡眠来了解情况。添加睡眠后,锁定会按预期进行等待,因此我认为日志记录只是出了问题。

    很可能您的锁定比您想象的要多。@Peter看起来像同一个对象
    ReentrantLock@4462cf1d
    ReentrantLock
    是否具有类似于
    信号灯的计数器?我不这么认为。你确定你没有错过日志中的一些解锁。根据日志记录的设置方式,锁实际上是有效的,但日志记录有问题。似乎在相关日志消息之间只传递了1/50秒。是否可能您正在使用异步日志记录器?