[英]Class Level and Object Level lock synchronization
class MyClass
{
public synchronized void print() {}
public static synchronized void buffer() {}
}
使静态对象同步将成为CLASS级对象,其中只有一个线程可以访问该对象。 该类同时具有静态和非静态Synchronized方法。
其他线程(线程B)可以通过对象锁定访问非静态同步方法(),而另一个线程(线程A)使用静态同步(获取类级别的锁 )方法吗?
我希望没有一个线程可以访问任何静态同步方法,直到(Thread-B)释放锁为止。
这两个问题的答案都是“是”:静态级别的锁不会阻止实例级别的synchronized
方法,它们适用于所有静态synchronized
方法。
但是,通常不鼓励在类上进行同步,因为这会使您的类遭受无限的等待攻击。 犯罪者在类上进行同步,从而阻止所有静态synchronized
方法运行。 更好的方法是使一个私有对象用于锁定并对其进行synchronize
,如下所示:
class MyClass
{
public synchronized void print() {}
private static Object staticLock = new Object();
public static void buffer() {
synchronized(staticLock) {
...
}
}
}
同步实例方法也是如此:如果要在潜在的非合作环境中使用该类,则最好使用私有对象进行锁定。
简而言之:
非静态方法使用当前对象的锁(每个对象只有一个线程)
静态方法使用关联的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
静态锁
已同步(YourClass.class / class对象)
实例锁
已同步(此/实例对象)
两者不互斥,两个线程将同时运行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.