class Foo{
static synchronized get(){}
synchronized() getMore(){}
}
我有两个对象Foo.get()
和f.getMore()
在两个不同的线程t1和t2中运行。我怀疑当线程t1获取类的锁时,线程t2是否可以访问方法getMore,或者由于类对象被t1锁定而阻止t2获得对该方法的访问和锁定。
class Foo{
static synchronized get(){}
synchronized() getMore(){}
}
我有两个对象Foo.get()
和f.getMore()
在两个不同的线程t1和t2中运行。我怀疑当线程t1获取类的锁时,线程t2是否可以访问方法getMore,或者由于类对象被t1锁定而阻止t2获得对该方法的访问和锁定。
静态同步 ---> 类级别锁定(类级别范围)
这与以下情况类似:
synchronized(SomeClass.class){
//some code
}
简单同步 ---> 实例级别锁定
例子:
class Foo{
public static synchronized void bar(){
//Only one thread would be able to call this at a time
}
public synchronized void bazz(){
//One thread at a time ----- If same instance of Foo
//Multiple threads at a time ---- If different instances of Foo class
}
}
Class
对象上,而不是实例对象上。你有两个锁分别作用于两个不同的对象。在你上面的场景中,不会有阻塞行为发生。
synchronized
锁定一个对象,而 static synchronized
则锁定代表类的对象。
t1 和 t2 可以同时调用这些方法,除非它们都在 static synchronized
方法中,除非只有一个线程在 wait()
状态。
注意:t1 和 t2 可以同时调用不同对象的 getMore()
方法。
synchonized static method
会获取与 Foo 类相关联的 java.lang.Class 对象的锁。
synchonized instance method
会获取实际对象的锁。