スレッド間で共有する単一の 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());
ご覧のように:
- [http-bio-8080-exec-9] ロック (ホールド カウントは 0 であり、予想どおりロック後に 1 になります)
- [キャメル スレッド #1] ロック ( [http-bio-8080-exec-9] がまだロック解除されていないため、この可能性があるのはなぜですか? )
MyProcessor は、メッセージがキューに到着した結果として呼び出されます。lock
オブジェクトはコンストラクターで MyProcessor に渡されます。上記のログでロック オブジェクトを出力すると、同じオブジェクト (同じ参照 ID を持つ) であることがわかります。
何か案は?
ありがとう!