我创建了2个对象和2个线程。 假设m1()和m2()是同步方法。
t1.m1(); t2.m2(); 两个线程可以同时执行吗?同步方法是否可以同时执行?
答案 0 :(得分:2)
同步在特定实例上发生。同步方法在调用方法的实例上同步。因此,t1.m1()
和t2.m2()
可以同时执行,当且仅当t1
和t2
引用不同的实例时。
答案 1 :(得分:1)
是的,如果两者都是非静态的并且使用两个不同的实例执行。
已添加说明。
因为monitor
实际上与实例相关联。因此,如果一个线程在一个实例上获取了锁,则该线程可以在另一个实例上自由调用该方法。
答案 2 :(得分:1)
它们可以同时执行,因为同步方法会锁定实例。
synchronized void someMethod(){
}
与
相同void someMethod(){
synchronized(this){
}
}
因此每个实例都有自己的锁同步。
静态方法使用类实例(SomeClass.class)。
答案 3 :(得分:0)
是的,如果它们是不同实例的实例方法,则它们不会发生同步。
答案 4 :(得分:0)
始终在监视器上完成同步。一次只能有一个线程访问监视器。
在同步方法时,监视器可以是对象(非静态)或类对象(静态方法)。
你应该想到
public synchronized void myMethod(){
...
}
为:
public void myMethod(){
synchronized (this) {
...
}
}
由于您有两个具有synchronized方法的独立对象实例,因此您有两个不同的监视器。 结果:两个线程可以同时工作。