java - Java 线程对象锁
问题描述
根据我的理解,每个对象都有一个可以被当前线程持有的锁。
所以,基于这个例子:
public class T1 {
private final Object o = new Object();
public void m1() {
synchronized(o) {
//...wait some time
}
}
}
如果我创建类似的东西:
T1 subject1 = new T1();
T1 subject2 = new T1();
Runnable r1 = new Runnable() {
@Override
public void run() {
subject1.m1();
subject2.m1();
}
};
Thread t1 = new Thread(r1);
t1.start();
将有两个锁,subject1.o
并且subject2.o
(我测试它们是不同的实例),这意味着这两种方法将独立运行,同时,在我的示例中,一个被执行,然后,在它释放锁之后,下一个运行虽然subject1 和 subject2 是具有不同锁的不同实例。
为什么?
解决方案
在您的示例中,您在同一线程中按顺序运行这两种方法。要并行执行它们,您必须在单独的线程中运行它们。
T1 subject1 = new T1();
T1 subject2 = new T1();
Runnable r1 = new Runnable() {
@Override
public void run() {
subject2.m1();
}
};
Runnable r2 = new Runnable() {
@Override
public void run() {
subject2.m1();
}
};
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
推荐阅读
- .net - System.Linq.Queryable.dll 无法反编译
- r - R:抓取一个动态加载页面,滚动很长但有限,直到结束(使用 RSelenium?)
- python - 为什么我在pygame中得到一个恒定的0 fps
- python - 将多个 xml 属性提取到 pandas 数据框
- swiftui - 在使用 swiftui 的小部件中如何获取当前位置?
- manifest - 谷歌扩展 - 自定义光标
- javascript - 最近双击元素上的 .last.removeClass()
- javascript - axios 请求被阻止 | 反应
- javascript - 如何使用 ref react native 进入屏幕顶部
- kubernetes - 是否可以在 cron 作业 pod 上使用 Kubernetes 自动缩放