假设我们有一个对象foo:
class Foo(){
public synchronized void instanceMethod(){}
}
var foo = new Foo();
如果我有富锁:
synchronized(foo){
foo.instanceMethod();
}
我也对锁instanceMethod()
打电话?问这个问题的另一种方式 - 如果我有富锁,可以在另一个线程中调用foo.instanceMethod()(同时)?
如果我有富锁,可以在另一个线程中调用foo.instanceMethod()?
他们可以打电话,但通话将等到执行叶synchronized
您块foo
,因为instanceMethod
是synchronized
。声明一个实例方法synchronized
是大致相同把其整个身体中的块synchronized
上this
。
如果instanceMethod
不同步,那当然,呼叫不能等待。
但是请注意,您所显示的synchronized
块是不必要的:
synchronized(foo){ // <==== Unnecessary
foo.instanceMethod();
}
由于instanceMethod
是synchronized
,可以仅仅是:
foo.instanceMethod();
......除非有别的东西在块为好。
class Foo {
public synchronized void a() { //Do something }
public void b() {
synchronized(this) { // Do something }
}
public void c() { // Do something }
}
然后:
Foo foo = new Foo();
foo.a();
foo.b();
synchronized(foo) { foo.c(); }
所有3个方法是在同步方面都几乎相等。
还有如“锁定”的方法没有这样的事情。锁只在对象上完成的。标记的方法synchronized
简单地使得锁定实例(或静态方法它的类对象)。
这是该方法被称为甚至在 - 当你锁定的对象上访问的方法,执行将被作为线程无法检索监控指定的物体阻挡。所以foo.a()
会当它获得foo
被阻止。
我突然想起了什么。如果你有一个线程调用foo.a()
,它走的是一条很长的时间才能完成,而当时另一个线程调用foo.c()
,然后foo.c()
仍将被封锁foo.a()
直到完成。