繁体   English   中英

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

[英]Class Level and Object Level lock synchronization

class MyClass
{
    public synchronized void print() {}

    public static synchronized void buffer() {}
}

使静态对象同步将成为CLASS级对象,其中只有一个线程可以访问该对象。 该类同时具有静态和非静态Synchronized方法。

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

  2. 我希望没有一个线程可以访问任何静态同步方法,直到(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM