1

スレッド間で共有する単一の 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. [キャメル スレッド #1] ロック ( [http-bio-8080-exec-9] がまだロック解除されていないため、この可能性があるのはなぜですか? )

MyProcessor は、メッセージがキューに到着した結果として呼び出されます。lockオブジェクトはコンストラクターで MyProcessor に渡されます。上記のログでロック オブジェクトを出力すると、同じオブジェクト (同じ参照 ID を持つ) であることがわかります。

何か案は?

ありがとう!

4

1 に答える 1