我對Java中的多線程並不很有經驗。我想要的是設置一個代碼塊的鎖。在我的情況下,我想避免樂觀鎖定異常,同時爲某個用戶做一些同步。方法replicateUser
可以由同一用戶的多個線程調用。但是不能保證,那authenticatedUser
永遠是同一個對象。如何有效地鎖定代碼塊以避免樂觀鎖定異常
那麼我怎樣纔能有效地鎖定這一部分?我不想要的是,該部分對於所有線程都是鎖定的,但僅限於具有相同用戶的部分。如下例所示,我可以使用getUserName()
鎖定字符串對象嗎?在authenticatedUser.getUserName().intern()
private void replicateUser(AuthenticatedUser authenticatedUser) {
//
// How to synchronize the following block correctly?
//
synchronized (authenticatedUser.getUserName()) {
User dbUser = userRepository.findOne(authenticatedUser.getUserName());
if (!checkIsUserReplicated(authenticatedUser, dbUser)) {
doReplication(dbUser);
}
}
}
嘗試提供關於樂觀鎖定異常的詳細信息,該塊synchnized不是解決此問題的方法。 –
@Vash如果是解決方案,我不會發布這個問題!換句話說,我的問題可能是:避免多個線程在db中編寫相同記錄的解決方案是什麼。因爲如果他們這樣做,可能會導致一個樂觀的鎖定例外......我更新了'synchronized'塊上方的推薦,以使其更清晰 – fischermatte
您是否已經找到了解決這一問題的方法。我也有同樣的情況。我希望我的一個服務方法應該只在已經有一個線程執行相同的用戶ID時才被鎖定。如果不同的用戶ID出現,那麼它不應該被鎖定。 – roanjain