私は、ユーザーがソケットを使っていろいろな場所から一度にログインする単純な銀行シミュレータをコーディングしています。銀行サーバーでは、すべての着信リクエストを格納するための有界バッファーを保持しています(例:資金の振り替え、口座残高の取得など)、この要求キューから各要求を引き出すためにバックグラウンドスレッドがサーバーエンド(バッファーリーダー) OSのスレッドスケジューラとして)、FCFSベースで実装されています。バウンドバッファ(プロデューサ/コンシューマ)を使用すると、同期メソッド/デッドロックの苦労を回避できますか?
バッファのput()メソッドとget()メソッドを条件付き同期にしました。
例:
// put method
while(total_buffer_size == current_total_requests) {
System.out.println("Buffer is full");
wait();
}
だから私の質問は、は、我々はデータの破損を避けるためには、Get-バランスまたは転送ファンドのようなメソッドを同期させることがありますか?私は、バッファリーダーが各リクエストを1つずつと関連するアクションを取るので、それは必要ではないと信じています。 これでデッドロックの状況を回避しましたか??どう思いますか?おかげ
EDIT2:
public synchronized boolean put(Messenger msg, Thread t, Socket s) throws InterruptedException {
while(total_buffer_size == current_total_requests) {
System.out.println("Buffer is full");
wait();
}
current_total_requests++;
requests[cur_req_in] = new Request(msg, s); // insert into Queue
cur_req_in = (cur_req_in + 1) % total_buffer_size ;
notifyAll();
return true;
}
// take each incoming message in queue. FIFO rule followed
public synchronized Request get() throws InterruptedException {
while(current_total_requests==0) wait();
Request out = requests[cur_req_out];
requests[cur_req_out] = null;
cur_req_out = (cur_req_out + 1) % total_buffer_size ;
current_total_requests--;
notifyAll(); //wake all waiting threads to continue put()
return out;
}
一度に1つのアクションしか実行しないので、同期する必要はありません。しかし、これは全体的なパフォーマンスを著しく阻害する可能性があります。なぜなら、千のリクエストを受け取った場合、各リクエストを処理するのに4msかかるため、キューの最後の人はサーバからの応答を得るのに4秒ほど待たなければならないからです。それは長い時間!! – vishakvkt
+1をすばやく返信します。これは、パフォーマンスがあまり考慮されていない学術プロジェクトのためのものです。私は何とかデッドロックの状況がないことを証明する必要があります。ありがとうございました – coder9