事件顺序保证存在并发方法调用

时间:2012-07-15 20:14:27

标签: java multithreading race-condition

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同步强制执行此假设吗?

2 个答案:

答案 0 :(得分:3)

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

如果同步deliver()方法,则不会阻止调度程序在此期间中断执行。但是当第一个线程保持锁定时,没有其他线程能够输入该方法,最终调度程序将唤醒原始线程并让他完成。

BTW Vector非常古老,有更好的选择。

答案 1 :(得分:1)

如果服务器是多线程的,那么如果传递未同步,则无法保证首先添加收到的第一条消息。