通常、スレッドの競合をどのように処理するかについて質問があります。たとえば、Web サイトで本を販売していて、入手できる本が 1 つしかない場合などです。2 人のクライアント (スレッド) がその本を購入したいという状況があり、両方が同時に注文した場合、どのように対処すればよいでしょうか? どうすればそれを回避できますか?
より具体的には、クライアントのリクエストを受け取るサーブレットがあります。つまり、doPost メソッドを作成することはできませんsynchronized
。これは、すべてのリクエスト (スレッド) が着信するときにパフォーマンスの問題が発生する可能性があるためです。
class Server{
private Library library = Library.getInstance(); //singleton for all books
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
synchronized(library){
Book book = library.get(request.getParameter("book_name"));
if(book != null){
int copies = book.getAvailable();
book.setAvailable(copies-1);
placeOrder();
}
}
}
}