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()方法,它不会阻止调度程序在此期间中断执行。但是当第一个线程持有锁时,没有其他线程能够进入该方法,最终调度程序将唤醒原始线程并让他完成。

BTWVector很古老,有更好的选择。

于 2012-07-15T20:21:12.753 回答
1

如果服务器是多线程的,那么如果deliver不同步,那么就不能保证收到的第一条消息会先添加。

于 2012-07-15T20:20:09.883 回答