java - Java锁定静态和非静态方法?
问题描述
我有下面的类,并且很少有线程想要访问这些方法。请澄清以下几点。
如果我使用对象实例锁锁定 staticMethod 方法,那么任何拥有类锁的线程都可以同时访问该方法吗?
如果我使用类实例锁锁定 instanceMethod 方法,那么任何拥有对象锁的线程都可以同时访问该方法吗?
class Test {
public static synchronized void staticMethod(){
}
public synchronized void instanceMethod(){
}
}
谢谢
解决方案
在java中加载的每个类都有对应的java.lang.Class实例代表该类,正是该java.lang.Class实例的锁用于保护该类的静态方法。其中 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方法,那么任何拥有对象锁的线程都可以同时访问该方法吗? 这取决于是否有任何线程对 Class 实例进行了锁定,然后线程拥有的对象锁不能访问它,否则它可以。
推荐阅读
- ios - UIPickerView 冻结 UI
- docker - 使用 Delve GO 调试器传递二进制命令行参数
- sql - 如何优化此选择
- r - 使用 cut 函数时中断参数出错
- python - 在 Windows 上进行登录的正确方法
- python-3.x - 定义和调用函数
- rdma - 如何测试 RDMA 读取选项的传输速率
- python - from _decimal import Decimal AttributeError: 模块 'numbers' 没有属性 'Number'
- java - 架构 arm64 的未定义符号:无法构建 RoboVM/LibGDX 项目
- java - Windows 上的 Socket InputStream 阻塞和交换查询