Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 防止对共享资源的并发更新_Java_Concurrency_Observable - Fatal编程技术网

Java 防止对共享资源的并发更新

Java 防止对共享资源的并发更新,java,concurrency,observable,Java,Concurrency,Observable,我有p类、Q类和R类相应地更新了表Pt、表Qt和表Rt。p类可以从图形界面Pi修改,Qi和Ri也是如此 现在,在类p、Q和R之间共享某些数据 出于这个原因,我们想提醒用户,每当Pi、Qi和Ri同时更新数据时,就会显示一条消息(在所有界面上),屏幕就会冻结: 正在从其他位置修改此数据,请稍候 我曾想过在这里使用Observable模式,其中p、Q和R类在Observable上注册,Observable负责并发访问。 这是正确的方法吗?对我来说,这听起来是一个不错的计划,我会将代码放在一个条件块中,

我有p类、Q类和R类相应地更新了表Pt、表Qt和表Rt。p类可以从图形界面Pi修改,Qi和Ri也是如此

现在,在类p、Q和R之间共享某些数据

出于这个原因,我们想提醒用户,每当Pi、Qi和Ri同时更新数据时,就会显示一条消息(在所有界面上),屏幕就会冻结: 正在从其他位置修改此数据,请稍候

我曾想过在这里使用Observable模式,其中p、Q和R类在Observable上注册,Observable负责并发访问。
这是正确的方法吗?

对我来说,这听起来是一个不错的计划,我会将代码放在一个条件块中,该条件块会检查observer对象,以查看是否为此代码设置了命名锁,如果没有,则运行代码,否则会响应用户告诉他们正在修改数据。根据您的语言和环境,有许多不同的方法可以做到这一点。我是命名锁的爱好者,在命名锁中,您可以在属于具有唯一名称的观察者对象的关联数组中设置一个锁,并且观察者对象有一个方法来检查是否存在命名锁以及是否已锁定


如果您需要所有并发请求来修改要运行的数据,那么还需要创建一个队列对象来组织和处理一个或多个队列请求,当观察者对象释放锁时,它将处理队列中的下一项。

我不知道是否只有观察者对您有好处。GUI渲染器线程应该只有一个,它应该只做最少的工作,而且它应该包含非常少的并发性,因为它会导致延迟

我想这会符合你的要求