Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存在并发方法调用时的事件顺序保证 类服务器{ 私有向量v=新的。。。 ... 公共无效交付(Msg){ ... v、 添加(味精); } } 类客户端{ 私有服务器s=server.getInstance();//单例 ... 公共图书馆{ s、 交付(新味精(…); } }_Java_Multithreading_Race Condition - Fatal编程技术网

Java 存在并发方法调用时的事件顺序保证 类服务器{ 私有向量v=新的。。。 ... 公共无效交付(Msg){ ... v、 添加(味精); } } 类客户端{ 私有服务器s=server.getInstance();//单例 ... 公共图书馆{ s、 交付(新味精(…); } }

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

如果多个并发客户机通过[non synchronized!]
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( ... ));
    }
}