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
同步强制执行此假设吗?
答案 0 :(得分:3)
不,你不能做出这样的假设,因为调度程序可以中断deliver()
内部但尚未进入v.add(msg)
的当前线程。调度程序切换到调用deliver()
(之后)的另一个线程,但设法完成整个deliver()
调用。
如果同步deliver()
方法,则不会阻止调度程序在此期间中断执行。但是当第一个线程保持锁定时,没有其他线程能够输入该方法,最终调度程序将唤醒原始线程并让他完成。
Vector
非常古老,有更好的选择。
答案 1 :(得分:1)
如果服务器是多线程的,那么如果传递未同步,则无法保证首先添加收到的第一条消息。