使用外类锁获取内部类锁?

时间:2013-09-14 04:21:51

标签: java multithreading concurrency

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

public class A{

      public int x;

      public class B{
        private static final int y;
      }

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

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

3 个答案:

答案 0 :(得分:1)

  

如果我在A类的每个方法上都使用了synchronized关键字,那么它也会锁定内部类的成员吗?

不,不会。

你似乎在很多方面感到困惑。

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

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

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


如果我理解你正在尝试做什么,正确的方法就是这样:

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

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

如果您在B上创建并调用同步静态方法以获取y字段的值,则会获得相同的效果。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

public class A {

      private Object mutex = new Object();
      private int x;
      private B b = new B();

      public class B {
        private int y;

        public int method() {        
           synchronized(mutex) {
              return x++;
          }

        }
      }

      public int method() {

          synchronized(mutex) {
             return x += b.y;
         }
      }
}