Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用外部类锁获取内部类锁?_Java_Multithreading_Concurrency - Fatal编程技术网

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

Java 使用外部类锁获取内部类锁?,java,multithreading,concurrency,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关键字,它还会锁定内部

我有一个外部类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关键字,它还会锁定内部类的成员吗?

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

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

不会的

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

  • 使用基本互斥体(例如,通过
    synchronized
    方法)仅锁定在同一互斥体上同步的其他线程

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

  • 在您的示例中,似乎要锁定
    静态
    字段,而不是实例字段


如果我正确理解了您要做的事情,那么正确的方法是:

 public synchronized int method1(){
     synchronized (B.class) {
         return x + B.y;
     }
 }
请注意,这涉及到获取两个互斥体,因此需要确保代码始终以相同的顺序获取它们。(如果不这样做,则存在死锁风险。)


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

一个示例,其中两个对象上有一个互斥锁。两个对象都可以更改变量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; } } } 公共A类{ 私有对象互斥=新对象(); 私人INTX; 私有B=新B(); 公共B级{ 私营企业; 公共int方法(){ 已同步(互斥){ 返回x++; } } } 公共int方法(){ 已同步(互斥){ 返回x+=b.y; } }
}你能举个例子吗?实际上,我正在研究粗粒度锁定链表数据结构的问题,其中我有以下结构-:class LList{public class Node{}public class InsertNode{}当一个线程(比如T1)在链表数据结构上获得锁时,我想确保没有其他线程在链表中的各个节点上获得锁,也没有在链表数据结构上获得锁。我如何确保这一点发生。@AnkitSablok-如上所述。使用两个对象作为互斥对象。