繁体   English   中英

在Java中使用同步块来一次阻止对多个方法的访问

[英]Using synchronized block in java to block access to multiple methods at once

如果我有两种方法:

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()吗?

谢谢。

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
        }
    }
}

同样,它与所讨论的特定对象有关。 这是有关lockJava文档

您的示例将从所有由同一类加载器加载的A类的所有实例中获取该锁的方法中锁定线程,因此,如果任何一个线程获取了阻止所有其他线程访问该对象上的那些方法中的任何一个的锁。或该类的任何其他对象。 通常,设置类似这样的操作可能不是一个好主意。 锁定将不必要地进行粗粒度处理(即使线程只希望访问属于不同实例且不会共享的数据),也会导致线程等待),并且会严重限制并发性。 如果您有一个实际需要的设计,则应该质疑您的设计。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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