类级和对象级锁同步

Kas*_*sun 1 java static multithreading

class MyClass
{
    public synchronized void print() {}

    public static synchronized void buffer() {}
}
Run Code Online (Sandbox Code Playgroud)

使静态对象同步会生成一个 CLASS 级别的对象,其中只有一个线程可以访问它。该类具有静态和非静态同步方法。

  1. 其他线程(线程-B)可以通过对象锁访问非静态同步方法(),而另一个线程(线程-A)使用静态同步(获取类级锁)方法吗?

  2. 我希望在 (Thread-B) 释放锁之前,没有线程访问任何静态同步方法。

das*_*ght 5

您的两个问题的答案都是“是”:静态级锁不会阻塞实例级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)

同步实例方法也是如此:如果要在潜在的非合作环境中使用该类,最好使用私有对象进行锁定。