Java 使用外部类锁获取内部类锁?
我有一个外部类A和一个公共内部类,结构如下-: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关键字,它还会锁定内部
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-如上所述。使用两个对象作为互斥对象。