0

我有一个外部类 A 并且有一个公共内部类,结构如下:

public class A{

      public int x;

      public class B{
        private static final int y;
      }

      public synchronized int method1(){
             return x+ B.y;
      }
}

问题是如果我在类 A 的每个方法上使用同步关键字,它是否也会锁定内部类的成员?

4

3 回答 3

1

如果我在类 A 的每个方法上使用同步关键字,它是否也会锁定内部类的成员?

不,不会的。

您似乎在这里的许多方面感到困惑。

  • 使用原始互斥锁(例如通过synchronized方法)仅锁定在同一个互斥锁上同步的其他线程。

  • 当您调用同步实例方法时,您获取的互斥锁是this...目标对象的互斥锁。

  • 在您的示例中,您似乎想要锁定一个static字段,而不是一个实例字段。


如果我正确理解您要做什么,那么正确的方法是这样的:

 public synchronized int method1(){
     synchronized (B.class) {
         return x + B.y;
     }
 }

请注意,这涉及获取两个互斥锁,因此您需要确保您的代码始终以相同的顺序获取它们。(如果你不这样做,那么就有死锁的风险。)

如果您创建并调用同步静态方法B来获取y字段的值,您将获得相同的效果。

于 2013-09-14T04:47:59.483 回答
0

不,内部类和外部类是两个不同的类对象,它们不会相同。我建议在外部类中创建一个字段以手动同步。

于 2013-09-14T04:30:43.177 回答
0

一个在 2 个对象上具有单个互斥锁的示例。两个对象都可以更改变量 x。

公共类 A {

      私有对象互斥=新对象();
      私人int x;
      私人 B b = 新 B();

      公共类 B {
        私人int y;

        公共 int 方法() {        
           同步(互斥){
              返回 x++;
          }

        }
      }

      公共 int 方法() {

          同步(互斥){
             返回 x += by;
         }
      }
}
于 2013-09-14T05:25:13.403 回答