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
很古老,有更好的选择。