我是多线程的初学者,并且遇到了这个概念:
2个方法m1是非静态同步的,m2是静态的 同步和2个线程T1访问m1与对象o1和T2 访问m2可以同时运行,因为m1和m2在2上同步 不同的对象。
那么为什么在下面的情况下,即使对象与Foo.class和f1和f2不同,Threads也无法同时访问该方法?
class Foo implements Runnable{
void run()
synchronised(Foo.class)
{
....
}
}
}
class Test{
psvm(){
Foo f1 = new Foo();
Foo f2 = new Foo();
Thread t1 = new Thread(f1);
Thread t2 = new Thread(f2);
t1.start();
t2.start();
}
}
答案 0 :(得分:1)
2个方法m1是非静态同步的,m2是静态的 同步和2个线程T1访问m1与对象o1和T2 访问m2可以同时运行,因为m1和m2是同步的 2个不同的对象。
非静态方法m1在this
(当前实例)上同步,静态方法m2在this.getClass()
(类对象当前实例所属)上同步。它们在不同的对象上同步,因此它们不会相互阻塞。
在发布的代码中,synchronized块具有显式监视器锁Foo.class
,不同的Foo
实例共享相同的Foo.class
,这意味着代码在上同步对象即可。因此,只有一个线程可以进入同步块,其他线程将被阻塞,直到它存在。
答案 1 :(得分:0)
在您的代码中,同步已作为类级别锁定完成。
当一个线程正在访问另一个线程等待轮到它时..
当您想要限制并发性以便所有线程可以轮流访问资源时,使用同步