[英]Synchronization in multi threading
我是多线程的初学者,并且遇到了这个概念:
因为m1和m2在2个不同的对象上同步,所以2种方法m1是非静态同步的,而m2是静态同步的,并且2条线程T1通过对象o1访问m1,而T2访问m2可以同时运行。
那么,为什么在以下情况下,即使对象与Foo.class以及f1和f2不同,线程也无法同时访问该方法?
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();
}
}
因为m1和m2在2个不同的对象上同步,所以2种方法m1是非静态同步的,而m2是静态同步的,并且2条线程T1通过对象o1访问m1,而T2访问m2可以同时运行。
非静态方法m1在this
实例(当前实例)上同步,静态方法m2在this.getClass()
上同步this.getClass()
当前实例所属的类对象)。 它们在不同的对象上同步,因此它们不能互相阻塞。
在发布的代码中,同步块具有显式的监视器锁定Foo.class
,不同的Foo
实例共享同一Foo.class
,这意味着代码在同一对象上同步。 因此,只有一个线程可以进入同步块,其他线程将被阻塞直到它存在。
在您的代码中,同步已作为类级别锁定完成 。
当一个线程正在访问时,另一个线程等待它的转..
当您想限制并发性时使用同步,以便所有线程可以轮流访问资源
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.