3
class server {
    private Vector<Msg> v = new ...
    ...
    public void deliver(Msg msg) {
       ...
       v.add(msg);
    }
}

class client {
    private server s = server.getInstance(); // singleton
    ...
    public void propose() {
       s.deliver(new Msg( ... ));
    }
}           

複数の同時クライアントがMsg[非同期!]deliverメソッドを使用して値 (オブジェクト) をサーバーに渡す場合、クライアントが最初に呼び出す [または、より正確には入力する] ものは何でも、deliverその値を最初にv–に格納すると想定できますか?またはdeliver、この仮定を保持するために同期化を必須にしていますか?

4

2 に答える 2

3

いいえ、スケジューラは現在のスレッドに割り込むことができるため、そのような仮定を行うことはできませdeliver()v.add(msg)。スケジューラは、(後で) 呼び出す別のスレッドに切り替えますが、呼び出しdeliver()全体を完了することができdeliver()ます。

メソッドを同期deliver()すると、その間にスケジューラが実行を中断するのを防ぐことはできません。しかし、最初のスレッドがロックを保持している間、他のスレッドはそのメソッドに入ることができず、最終的にはスケジューラが元のスレッドを起動して終了させます。

ところでVector、かなり古いものですが、より良い代替手段があります。

于 2012-07-15T20:21:12.753 に答える
1

サーバーがマルチスレッドの場合、deliver が同期されていない場合、最初に受信したメッセージが最初に追加されるとは限りません。

于 2012-07-15T20:20:09.883 に答える