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

时间:2014-02-16 14:21:40

标签: java multithreading core

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

有人可以帮我解决这个问题吗?

6 个答案:

答案 0 :(得分:66)

通常,synchronized方法用于保护对同时访问的资源的访问。当并发访问的资源属于您的类的每个实例时,您使用synchronized实例方法;当资源属于所有实例时(即它位于static变量中),那么您使用synchronized static方法来访问它。

例如,您可以创建一个static工厂方法,该方法保留其生成的所有对象的“注册表”。此类注册表的自然位置是static集合。如果您的工厂是从多个线程使用的,则需要使用工厂方法synchronized(或方法中有synchronized块)来保护对共享static集合的访问。

请注意,在构建要在其他人编写的代码中使用的库时,使用没有特定锁定对象的synchronized通常不是最安全的选择。这是因为恶意代码可以在您的对象或类上进行同步,以阻止您自己的方法执行。要保护您的代码不受此影响,请创建一个私有的“锁定”对象,实例或静态,并在该对象上进行同步。

答案 1 :(得分:52)

在运行时,每个加载的类都有一个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 synchronized方法的预期目的是当您希望一次只允许一个线程使用存储在类的static个变量中的某些可变状态时。

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

答案 2 :(得分:36)

简单来说,static synchronized方法将锁定类而不是对象,它将锁定类,因为关键字static表示:“类而不是实例”。

关键字synchronized表示一次只能有一个线程访问该方法 而static synchronized意味着:

  

一次只能有一个线程访问该类。

答案 3 :(得分:0)

静态方法可以同步。但是每个班级只有一个锁。加载Java类时,将在其中提供相应的java.lang.class类对象。静态同步方法需要该对象的锁。  因此,当您有一个静态字段,应该限制它一次只能被多个线程访问时,可以将这些字段设置为私有,并创建公共静态同步的setter或getter来访问这些字段。

答案 4 :(得分:0)

假设一个类中有多个静态同步方法(m1,m2,m3,m4),并且假设一个线程正在访问m1,那么没有其他线程可以同时访问任何其他静态同步方法。

答案 5 :(得分:0)

Java VM每个类包含一个类对象。每个类可能都有一些共享变量,称为静态变量。如果代码的关键部分在并发环境中使用这些变量,那么我们需要将该特定部分设为同步。如果有多个静态同步方法,则一次只能执行其中一个,而不会抢占。这就是对类对象的锁定。