Java锁定静态和非静态方法?
我有下面的类,很少有线程想要访问这些方法。 请澄清以下几点 如果我使用对象实例锁锁定staticMethod方法,那么任何拥有类锁的线程都可以同时访问该方法Java锁定静态和非静态方法?,java,multithreading,locking,Java,Multithreading,Locking,我有下面的类,很少有线程想要访问这些方法。 请澄清以下几点 如果我使用对象实例锁锁定staticMethod方法,那么任何拥有类锁的线程都可以同时访问该方法 class Test { public static synchronized void staticMethod(){ } public synchronized void instanceMethod(){ } } 如果我使用类实例锁锁定instanc
class Test {
public static synchronized void staticMethod(){
}
public synchronized void instanceMethod(){
}
}
如果我使用类实例锁锁定instanceMethod方法,那么任何拥有对象锁的线程都可以同时访问该方法
class Test {
public static synchronized void staticMethod(){
}
public synchronized void instanceMethod(){
}
}
感谢在java中加载的每个类都有对应的java.lang.class实例来表示该类,正是该java.lang.class实例的锁用于保护该类的静态方法。其中as instanceMethod使用对象锁。请查看下面方法上的注释
class Test {
// lock will be on corresponding instance of **java.lang.Class**
//representing Test class
public static synchronized void staticMethod(){
}
// lock will be on corresponding Test Class object
public synchronized void instanceMethod(){
}
}
关于你的问题:
1.如果我使用对象实例锁锁定staticMethod方法,那么任何拥有类锁的线程都可以同时访问该方法?
首先,您不应该用对象锁锁定静态方法,但如果您想用对象锁锁定它,那么代码段应该如下所示,在这种情况下,任何拥有类锁的线程只有在对象锁没有被任何其他线程占用时才能同时访问该方法
public static void staticMethod(Test test){
synchronized(test)
{ }
}
2.如果我使用类实例锁锁定instanceMethod方法,那么任何拥有对象锁的线程都可以同时访问该方法吗?这取决于是否有线程将锁置于类实例之上,然后线程拥有对象锁,否则它无法访问它。不能使用实例对象锁锁定静态方法。无法从静态上下文访问实例成员。