Kas*_*sun 1 java static multithreading
class MyClass
{
public synchronized void print() {}
public static synchronized void buffer() {}
}
Run Code Online (Sandbox Code Playgroud)
使静态对象同步会生成一个 CLASS 级别的对象,其中只有一个线程可以访问它。该类具有静态和非静态同步方法。
其他线程(线程-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) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
同步实例方法也是如此:如果要在潜在的非合作环境中使用该类,最好使用私有对象进行锁定。