0

如果我有两种方法:

public class A {

    public void doSomething() {
        synchronized(A.class) {
            //synchronized block here
        }
    }

    public void doSomethingElse() {
        synchronized(A.class) {
           //synchronized block here
        }
    }
}

所以我的问题是,这种A.class行为像全局锁吗?doSomething()意思是在另一个线程正在执行时一个线程执行方法会被阻塞doSomethingElse()吗?

谢谢你。

4

3 回答 3

3

A.class 像全局锁一样吗?

任何synchronized块都会锁定特定对象。锁定A.class充当ClassLoader您正在运行的对象的“全局”锁定,因为 Java 保证A.class每个加载程序中只有一个对象实例。 A.class是一个对象,就像new A()是一个对象。

锁定A.class与锁定静态方法相同:

public class A {
    public static synchronized void someStaticMethod() {
        // in here you are locked on A.class as well
    }
    public void doSomething() {
        synchronized (A.class) {
            // this block is locked on the same object as someStaticMethod()
        }
    }
}

相比之下,当您锁定实例方法(与静态方法相反)时,它与锁定A正在执行的实例相同。换句话说this

public class A {
    public synchronized void someInstanceMethod() {
        // in here you are locked on the instance of A (this)
    }
    public void doSomething() {
        synchronized (this) {
            // this block is locked on the same instance of A
        }
    }
}

同样,它是关于所讨论的特定对象。这是关于 locks 的 Java 文档

于 2012-07-19T22:05:54.467 回答
1

您的示例会将线程锁定在由同一类加载器加载的 A 类的所有实例中获取锁的所有方法之外,因此,如果任何一个线程获取锁,该锁会阻止所有其他线程访问该对象上的任何这些方法或该类的任何其他对象。通常设置这样的东西可能是一个坏主意。锁将不必要地粗粒度(导致线程等待,即使它们只想访问属于不存在共享的不同实例的数据)并且会过度限制并发性。如果你有一个真正需要这个的设计,你应该质疑你的设计。

于 2012-07-20T13:42:11.657 回答
0

它获得对象锁,所有其他线程将被阻塞,直到current thread releases the lock。根据java规范:

同步方法在执行之前获取监视器(第 17.1 节)。对于类(静态)方法,使用与方法类的 Class 对象关联的监视器。对于实例方法,使用与 this(调用该方法的对象)关联的监视器

.

于 2012-07-19T21:35:46.557 回答