首页 > 解决方案 > 访问B类中的A类字段时Java同步块

问题描述

我想问与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 怎么办?

在我看来,答案是肯定的(这不是不安全的),但我只是想确保并询问更好的方法来做到这一点。

标签: javasynchronizationsynchronized

解决方案


更常见的方法是实例化一个 ReadWriteLock 并从中生成两个写锁,并在 A 和 B 中使用它们。A 的同一个实例将共享相同的锁


推荐阅读