静态同步方法在java中有什么用?

2022-08-31 12:56:04

我脑子里有一个问题。我已经读到静态同步方法锁定在类对象中,同步方法锁定对象的当前实例。那么锁定类对象的含义是什么呢?

任何人都可以在这个话题上帮助我吗?


答案 1

通常,方法用于保护对并发访问的资源的访问。当同时访问的资源属于类的每个实例时,请使用实例方法。当资源属于所有实例时(即当它在变量中时),则使用方法访问它。synchronizedsynchronizedstaticsynchronized static

例如,您可以创建一个工厂方法,该方法保留它所生成的所有对象的“注册表”。这种登记处的一个自然位置将是一个集合。如果从多个线程使用工厂,则需要创建工厂方法(或在方法内部有一个块)以保护对共享集合的访问。staticstaticsynchronizedsynchronizedstatic

请注意,在构建要在其他人编写的代码中使用的库时,不使用特定的锁定对象通常不是最安全的选择。这是因为恶意代码可能会在您的对象或类上进行同步,以阻止您自己的方法执行。若要防止代码发生这种情况,请创建一个私有的“锁定”对象(实例或静态对象),并改为在该对象上进行同步。synchronized


答案 2

在运行时,每个装入的类都有一个 Class 对象的实例。这是通过方法用作共享锁对象的对象。(任何同步的方法或块都必须锁定某些共享对象。static synchronized

如果需要,还可以手动同步此对象(无论是否在静态方法中)。这三种方法的行为相同,一次只允许一个线程进入内部块:

class Foo {
    static synchronized void methodA() {
        // ...
    }

    static void methodB() {
        synchronized (Foo.class) {
            // ...
        }
    }

    static void methodC() {
        Object lock = Foo.class;
        synchronized (lock) {
            // ...
        }
    }
}

方法的预期用途是,您希望一次只允许一个线程使用存储在类的变量中的某些可变状态。static synchronizedstatic

如今,Java在java.util.concurrent及其子包中具有更强大的并发功能,但核心Java 1.0构造(如方法)仍然有效且可用。synchronized