【发布时间】:2017-12-13 08:26:21
【问题描述】:
我有一种情况,在类 2 的多个实例中,一个操作会导致两者的状态发生变化,因为这是一个多线程应用程序,我想确保除非执行该特定代码,否则没有试图访问上述 2 个实例中的任何一个的其他线程处于等待状态。 使用 synchronized 或 lock 我们可以在单个实例上获取锁并将同步块嵌套在 2 个对象上也不是一个好主意。
synchronized(obj1){
synchronized(obj2){
}
}
另一个潜在的问题是,即使内部对象 obj2 是空闲的,由于外部对象被锁定,线程也会一直等待。 解决此问题的最佳方法可能是什么。
【问题讨论】:
-
“将同步块嵌套在 2 个对象上也不是一个好主意。”为什么不?你有什么样的代码路径?毕竟你想避免死锁,所以即使
obj2是免费的,如果obj1不是免费的也没关系。 -
如果再有类似
sync(obj2) { sync(obj1) {...} }的代码就麻烦了 -
为什么需要这样做?它们是否也独立锁定?我建议使用
Lock- 并在访问对象之前始终锁定它。此外,使用Lock,您可以使用tryLock,从而防止死锁——在您必须按顺序获取锁的情况下。 -
是的,所以如果基本上以对象的相反顺序进行操作,它可能会陷入死锁
-
是的,那会是个问题,所以解决办法是确保没有这样的代码。你的问题?
标签: java multithreading locking synchronized