我有一個訪問緩存的Jersey REST服務方法。此方法會跟蹤requestsBeingProcessed
,因爲MessageService
會定期更新緩存,但只能在沒有處理請求時纔會這樣做。對正在處理的請求數進行遞增和遞減的調用是同步的,以確保線程安全訪問。如何在同步Java線程時避免循環邏輯?
class TeamInfoService {
@GET
@Path("/{teamId}")
@Produces(MediaType.TEXT_PLAIN)
public String getTeamInfo(@PathParam("teamId") final int teamId) {
MessageService.incrementRequestsBeingProcessed;
String team = teamCache.getTeams().get(teamId);
MessageService.decrementRequestsBeingProcessed;
return team;
}
}
class MessageService {
private static int requestsBeingProcessed = 0;
public synchronized static void incrementRequestsBeingProcessed() {
requestsBeingProcessed++;
}
public synchronized static void decrementRequestsBeingProcessed() {
requestsBeingProcessed--;
}
public synchronized static void getRequestsBeingProcessed() {
return requestsBeingProcessed;
}
}
的問題是,MessageService
有獲得鎖更新緩存,而只能通過檢查requestsBeingProcessed
,只能由一個線程在同一時間訪問更新。
public synchronized static void updateCache(String message) {
while(getRequestsBeingProcessed() != 0) {
//wait until there are no requests being processed
}
processMessage(message);
}
我有一個雞/蛋這裏的情況:我不能因爲一個鎖需要檢查requestsBeingProcessed
鎖更新requestsBeingProcessed
。有什麼不同的方式可以解決這個問題嗎?
如果您想直接使用基本併發原語,那麼你應該在looke'Object.wait'和'Object.notify' /'Object.notifyAll'。在'decrementRequestsBeingProcessed'方法中,當你檢測到requestsBeingProcessed達到零時,你可以調用'notify'。這會在'notify'正在執行時解鎖同步監視器 - 檢查Javadoc。 –