Java 存在并发方法调用时的事件顺序保证 类服务器{ 私有向量v=新的。。。 ... 公共无效交付(Msg){ ... v、 添加(味精); } } 类客户端{ 私有服务器s=server.getInstance();//单例 ... 公共图书馆{ s、 交付(新味精(…); } }
如果多个并发客户机通过[non synchronized!]Java 存在并发方法调用时的事件顺序保证 类服务器{ 私有向量v=新的。。。 ... 公共无效交付(Msg){ ... v、 添加(味精); } } 类客户端{ 私有服务器s=server.getInstance();//单例 ... 公共图书馆{ s、 交付(新味精(…); } },java,multithreading,race-condition,Java,Multithreading,Race Condition,如果多个并发客户机通过[non synchronized!]deliver方法将值(Msg对象)传递给服务器,那么可以假定任何客户机调用[或者更准确地说,输入]deliverfirst将首先在v中存储其值,或者强制执行deliver同步以保持此假设?如果服务器是多线程的,那么如果deliver未同步,则不保证首先添加收到的第一条消息。否,您不能做出这样的假设,因为调度程序可以中断deliver()中的当前线程,但该线程尚未到达v.add(msg)。调度器切换到另一个线程,该线程调用deliver
deliver
方法将值(Msg
对象)传递给服务器,那么可以假定任何客户机调用[或者更准确地说,输入]deliver
first将首先在v
中存储其值,或者强制执行deliver
同步以保持此假设?如果服务器是多线程的,那么如果deliver未同步,则不保证首先添加收到的第一条消息。否,您不能做出这样的假设,因为调度程序可以中断deliver()
中的当前线程,但该线程尚未到达v.add(msg)
。调度器切换到另一个线程,该线程调用deliver()
(之后),但设法完成整个deliver()
调用
如果同步deliver()
方法,它不会阻止计划程序同时中断执行。但是当第一个线程持有锁时,没有其他线程能够进入该方法。调度程序最终将唤醒原始线程并让其完成
顺便说一句,还有更好的选择。好吧,对于后一部分:
服务器
实例实际上正在访问一个ConcurrentHashMap
,并通知本地工作线程处理新添加的值……但是为了简单起见,我在我的示例中选择了向量
,因为它是“通过设计同步”(并且不会增加问题的复杂性)。[无可否认,我问题的“复杂性”一开始并没有那么高……事实证明。]
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( ... ));
}
}