[英]Java Threads Object Lock
根据我的理解,每个对象都有一个可以被当前线程持有的锁。
因此,基于此示例:
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();
将有两个锁,
subject1.o
和subject2.o
(我测试了它们是不同的实例),这意味着这两种方法将同时独立运行
您说这两个方法将独立运行,尽管您只有一个封闭的方法来运行两个线程。 相反,这两种方法必须位于不同的Runnable
才能同时执行。
T1 subject1 = new T1();
T1 subject2 = new T1();
Runnable r1 = subject1::m1;
Runnable r2 = subject2::m1;
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
将有两个锁,
subject1.o
和subject2.o
...,这意味着这两种方法将同时独立运行。
否。存在两个锁的事实并不意味着对m1
函数的两次调用将独立且同时运行。 这仅意味着两个调用可以同时运行。 但是,只有当这两个调用中的每一个发生在不同的线程中时,才会发生这种情况。
这里已经尝试告诉您的其他答案是,您的代码不会从两个不同的线程进行两次调用。 它从同一线程进行两个调用。 您编写了以下run()方法:
public void run() {
subject1.m1();
subject2.m1();
}
run()
方法没有什么特别的。 您编写了它,它的工作原理与您编写的任何其他方法完全相同:您编写的方法将首先调用subject1.m1()
,然后在返回时将调用subject2.m1()
。
如果要并行进行这些调用,请执行@Palamino或@snr向您显示的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.