Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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_Multithreading_Object_Synchronization - Fatal编程技术网

Java 在现实生活中同步多线程程序中的方法有什么意义

Java 在现实生活中同步多线程程序中的方法有什么意义,java,multithreading,object,synchronization,Java,Multithreading,Object,Synchronization,我知道多线程和线程同步在java中是如何工作的,但最近在研究thread wait()和notify()方法时,我把所有事情都弄糊涂了,现在我想知道使方法同步的意义是什么。我了解到了这一点“我们使用同步方法,以便没有其他线程可以访问同一对象上的代码块”。在这里,“在同一对象上”对我来说似乎很不自然。在这些日子里,越来越多的程序采用面向对象的方法,因此它们倾向于使用对象执行所有操作,那么我们为什么要使用单个对象呢(间接指先前提及的同一对象)做我们的工作?请用一个现实生活中的例子向我解释这个概念。我

我知道多线程和线程同步在java中是如何工作的,但最近在研究thread wait()和notify()方法时,我把所有事情都弄糊涂了,现在我想知道使方法同步的意义是什么。
我了解到了这一点“我们使用同步方法,以便没有其他线程可以访问同一对象上的代码块”。在这里,“在同一对象上”对我来说似乎很不自然。

在这些日子里,越来越多的程序采用面向对象的方法,因此它们倾向于使用对象执行所有操作,那么我们为什么要使用单个对象呢(间接指先前提及的同一对象)做我们的工作?

请用一个现实生活中的例子向我解释这个概念。我能找到的唯一的例子是一个旧的银行账户例子,一对夫妇有一个共同的账户,他们试图同时做一些修改。请以任何其他现实生活中的例子为例。谢谢。
更新


我在github上添加了一些代码。在代码中,我无法创建一个出租车类实例。每次我创建一个新线程时,都会创建一个新的出租车实例。
下面是我的

假设您希望在移动应用程序上预订出租车。因此,在特定时刻,应用程序只能将出租车分配给一个客户。因此,在这种情况下,您也可以需要同步,以便出租车状态在交易后保持一致。

假设您希望在移动应用程序上预订出租车。因此,在特定时刻,应用程序只能将出租车分配给一个客户。因此,在这种情况下,您也需要同步,以便出租车状态在交易后保持一致。

这不是真的必须在多线程程序中执行同步。这实际上取决于我们的用例

我们将仅在对象具有
共享可变
状态时同步语句块或方法,即该对象在多个线程之间共享,并且其状态是可变的

让我们举一个简单的火车票的例子。一列火车的座位数量有限,任何人都可以使用他们的站点预订。如果两个人试图为同一列火车预订车票,其中一个人必须首先在火车对象上获取锁,预订车票并释放锁,而另一个人则必须等待锁打开这样,第一个人对可用座位数所做的更改对下一个等待订票的人是可见的。如果没有同步,我们永远无法确定票数的可靠性

因此,我们只对共享的可变对象进行同步。如果您试图获取的对象不可变,则无需进行同步

谈到
wait()
notify()
,这些都是在多个线程之间进行通信的低级API。wait()和notify()的经典示例是线程池。下面是Brian Goetz关于这些方法用法的精彩介绍


希望这能说明问题。

在多线程程序中进行同步并不是必须的。它实际上取决于我们的用例

我们将仅在对象具有
共享可变
状态时同步语句块或方法,即该对象在多个线程之间共享,并且其状态是可变的

让我们举一个简单的火车票的例子。一列火车的座位数量有限,任何人都可以使用他们的站点预订。如果两个人试图为同一列火车预订车票,其中一个人必须首先在火车对象上获取锁,预订车票并释放锁,而另一个人则必须等待锁打开这样,第一个人对可用座位数所做的更改对下一个等待订票的人是可见的。如果没有同步,我们永远无法确定票数的可靠性

因此,我们只对共享的可变对象进行同步。如果您试图获取的对象不可变,则无需进行同步

谈到
wait()
notify()
,这些都是在多个线程之间进行通信的低级API。wait()和notify()的经典示例是线程池。下面是Brian Goetz关于这些方法用法的精彩介绍


希望这能说明问题。

这里我正在同步的对象是什么?您应该在您试图预订的出租车实例上同步谢谢。这是一个非常简单且不言自明的示例。消除了我的许多疑问,但您能否解释一下,如果可能的话,方法wait()和notify()在本示例中的适用范围:).假设有20位客户同时尝试预订出租车,那么他们中只有一位(假设customerA)将允许继续预订,所有其他人将等待此出租车实例。要么customerA预订完成正确,要么预订尝试超时,然后应通知所有其他19位客户采取下一步适当的操作。基本上,这取决于您如何设计系统,但其中一种用法可能如我所述,请h看一看我对@Arkantos(以下)答案的最新评论。这里我应该如何为10辆出租车(本例)实现同步和wait(),notify()。我是否需要创建所有10辆出租车的对象并同步它们,然后调用wait()和notify()分别在它们上进行适当的同步?这里是我正在同步的对象是什么?您应该在您试图预订的出租车实例上进行同步谢谢。这是一个非常简单且自解释的示例。消除了我的许多疑问,但您能不能也解释一下方法等待()和通知()的位置如果可能的话,也可以用这个例子:)。假设有20位顾客同时尝试预订出租车,那么他们中只有一位(比如customerA)可以继续预订,其他的都可以