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( ... ));
    }
}

如果多个并发客户端通过[non-synchronized!] Msg方法将值(deliver对象)传递到服务器,则可以假设任何客户端首先调用[或更准确地说是输入] deliver都将存储其值的方法是否可行。首先在v中使用-还是必须强制同步deliver才能使这种假设成立?

最佳答案

不,您不能做出这样的假设,因为调度程序可以中断deliver()内部的当前线程,但尚未将其设置为v.add(msg)。调度程序切换到另一个调用deliver()的线程(此后),但是设法完成整个deliver()的调用。

如果同步deliver()方法,则不会阻止调度程序同时中断执行。但是,当第一个线程持有锁si时,其他线程将无法进入该方法,最终调度程序将唤醒原始线程并让他完成操作。

顺便说一句 Vector 很古老,有更好的选择。

10-06 06:09