需要同步块中的对象

时间:2015-09-16 11:22:46

标签: java multithreading

根据我的理解,如果我们在代码中添加synchronized关键字,其中的整个代码块将被锁定用于其他线程。在这种情况下,为什么我们需要在synchronized关键字中指定特定对象。 例如。的同步(lockObject)即可。 lockObject在这里有什么用?

2 个答案:

答案 0 :(得分:1)

  

如果我们在代码中添加synchronized关键字,其中的整个代码块将被锁定为其他线程。

不正确的。 synchronized涉及一种完全独立于您的代码块的机制:获取和释放互斥锁。 Java具有synchronized块的概念,以方便确保在获取锁之后正确释放锁。

因此,实际发生的是您的线程获取与括号中给出的实例关联的监视器,然后继续执行代码块,然后释放监视器。同时没有其他线程可以获取特定的监视器,但它可以很好地获取任何其他对象的监视器。如果您不注意始终在同步块中包含相同的对象,则不会相互排斥。

答案 1 :(得分:1)

假设您有两个要同步的资源;浴室和冰箱。

即使有人在使用浴室,你也希望人们能够从冰箱里取出小吃,不是吗?

所以你在冰箱和浴室使用不同的锁。

在编程术语中,这意味着每个独立资源都可以拥有它自己的lockObject。

请注意,资源可以有多种方法来访问它们 - 同一资源的所有访问者都应使用相同的锁!毕竟,如果你有两扇门进入浴室,如果你只锁定其中一扇门,它就不会有多大好处。