class MyClass
{
public synchronized void print() {}
public static synchronized void buffer() {}
}
使静态对象同步会产生CLASS级别对象,其中只有一个Thread可以访问它。该类具有静态和非静态同步方法。
其他线程(Thread-B)可以通过对象锁访问非静态同步方法(),而另一个线程(Thread-A)使用静态同步(获取级别锁定)方法?
我希望非线程访问任何静态同步方法,直到(Thread-B)释放锁。
答案 0 :(得分:4)
您的问题的答案都是“是”:静态级别锁定不会阻止实例级synchronized
方法,并且它们适用于所有静态synchronized
方法。
但是,一般情况下,不鼓励对类进行同步,因为它会使您的类暴露于无限等待攻击。犯罪者在类上同步,阻止所有静态synchronized
方法运行。更好的方法是创建一个用于锁定的私有对象,并在其上synchronize
,如下所示:
class MyClass
{
public synchronized void print() {}
private static Object staticLock = new Object();
public static void buffer() {
synchronized(staticLock) {
...
}
}
}
同步实例方法:如果要在潜在的非合作环境中使用该类,最好使用私有对象进行锁定。
答案 1 :(得分:0)
简而言之:
非静态方法使用当前对象的锁(每个对象只有一个线程)
静态方法使用关联的Class
对象(每个类只有一个,因此每个Class
对象只有一个therad)
考虑擦除非常重要:
// If you have this:
class MyClass<T> {
static synchronized myMethod() { ... }
}
MyClass<Integer> objInt = new MyClass<Integer>();
MyClass<String> objString = new MyClass<String>();
// Then only one thread will be able to execute myMethod(),
// even when ojbInt and ObjString are not "exactly" the "same"
// class in compilation time
答案 2 :(得分:0)
静态锁
synchronized(YourClass.class / class object)
实例锁
synchronized(this / instance object)
两者都不是互斥的,两个线程都会同时运行