我試圖使用來實現座位預訂驗證一個同步塊是這樣的:座位預訂使用同步塊
synchronized(this) {
int seatsBooked = GrantAssessment.countByExamSessionAndExamDateBetweenAndIsCancelled(examSession,now,now+1,false)
int seatsRemaining = examSession.maxSeat - seatsBooked
if(seatsRemaining<1){
throw new CustomValidationException("All seats booked...")
}
// assign assessment which increases countByExam... query count by 1
grantAssessment = assignAssessment(examCommerce,examSession,examDate,identificationType,idNumber)
}
assignAssessment()方法的代碼如下:
def assignAssessment(ExamCommerce examCommerce, ExamSession examSession,Date examDate,IdentificationType identificationType,String idNumber) {
.................
examSession.addToGrantAssessmentList(grantAssessment)
..............................
grantAssessment.save(failOnError: true,flush: true)
examSession.save(failOnError: true,flush: true)
return grantAssessment
}
當我打使用瀏覽器1(不同的線程)它進入synchornized塊並分配一個座位。當瀏覽器2(線程2,幾乎同時)進入查詢計數通過下面的代碼返回的塊:
GrantAssessment.countByExamSessionAndExamDateBetweenAndIsCancelled(examSession,now,now+1,false)
被same.But同一線程表示同步塊後還原值(正確的)。
由於這個原因,兩個線程分配即使totalSeat等於1
如何處理併發使得availableSeats值應該被以同步的方式正確地計算出的座位。 JMS是否適合這種情況?
http://tutorials.jenkov.com/java-concurrency/synchronized.html – Ahmed