类级别和对象级别锁定同步

时间:2014-03-20 00:56:19

标签: java multithreading static

class MyClass
{
    public synchronized void print() {}

    public static synchronized void buffer() {}
}

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

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

  2. 我希望非线程访问任何静态同步方法,直到(Thread-B)释放锁。

3 个答案:

答案 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)
两者都不是互斥的,两个线程都会同时运行