【发布时间】:2018-12-29 14:43:08
【问题描述】:
我想问一个与Java同步相关的问题,为了澄清我的疑惑,我写了如下简单的代码:
class A {
public int variable;
public int secondVariable;
public Object variableLock = new Object();
public Object secondVariableLock = new Object();
public void doingSthWithVariable() {
synchronized (variableLock) {
.... } }
public void doingSthWithVariableInOtherMethod() {
synchronized (variableLock) {
.... } }
public void doingSthWithSecondVariable() {
synchronized (secondVariableLock) {
.... } }
public void doingSthWithSecondVariableInOtherMethod() {
synchronized (secondVariableLock) {
.... } }
}
class B {
public A instanceOfA;
public void doingSthWithAVariables() {
synchronized (instanceofA.variableLock) {
synchronized (instanceofA.secondVariableLock) {
....} } }
}
我的问题是:如果它是安全的,并且在 B 类中使用 A 类的 variableLock/secondVariableLock 是否是一种好习惯? 我的意思是,我需要在 B 类的实例中阻止这两个变量的任何更改,我想知道这是否是一个好方法。 还有一个问题:如果我在多个 B 对象中有相同的 instanceOfA 怎么办?
在我看来答案是肯定的(这不是不安全的),但我只是想确保并询问更好的方法。
【问题讨论】:
-
使用公共可变锁绝对不是一个好主意。我不确定您想要实现什么,但封装是使事情安全的关键。如果您希望在具有变量和第二个变量的互斥锁中执行方法,请将其放在 A 类中。将您的锁设为私有且最终。
-
那么如何将锁设为私有并由 A 类的公共 getter 将它们放入 B 类?
-
这稍微好一点,但它仍然是灾难的好方法。例如,两个锁同步但顺序不同的两个线程将导致死锁。你想解决什么具体的问题?
-
为什么需要两把锁?您只需要一把锁即可保护您的产品收藏。
-
回到我的第一条评论。如果你真的想要单独的锁,那么封装不要让每个调用者负责正确的锁定。把它放在一个类中。
标签: java synchronization synchronized