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

时间:2015-12-12 17:31:56

标签: java multithreading object synchronization

我已经意识到多线程和线程同步在java中是如何工作的,但是最近在研究线程wait()和notify()方法的过程中我感到很困惑,现在我想知道制作的重要性是什么方法同步。
我已经知道"我们使用synchronized方法,这样其他线程就无法访问同一个对象上的那段代码" 。在这里,"对同一个对象" 对我来说似乎很不自然。

在这些日子里,越来越多的程序遵循面向对象的方法,所以他们倾向于用物体做所有事情为什么我们想要使用单个物体(间接意味着前面提到同一物体)要做我们的工作?

请解释我这个概念与现实生活中的例子。我能找到的唯一例子是旧的银行帐户示例,其中丈夫和妻子有一个联合帐户,他们正在尝试同时进行一些修改。请采取任何其他现实生活中的例子。谢谢 更新

我在github上添加了一些代码。在代码中,我无法创建出租车类的单个实例。每当我创建一个新线程时,就会创建一个新的出租车实例。
这里是code

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

只有当该对象具有shared mutable状态时,我们才会同步一个语句块或方法,即对象在多个线程之间共享,并且它的状态是可变的。

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

所以我们只对Shared Mutable个对象进行同步。如果您尝试获取的对象不可变,则无需进行同步。

来到wait()notify(),这些是在多个线程之间进行通信的低级API。 wait()&的经典例子notify()是线程池。 Brian Goetz对这些方法的使用是一个很好的article

希望这说清楚。