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

sne*_*hal 49 java multithreading core

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

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

das*_*ght 74

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

例如,您可以创建一个static工厂方法,该方法保留其生成的所有对象的"注册表".这种注册的自然场所将是一个static集合.如果您的工厂是从多个线程使用的,则需要创建工厂方法synchronized(或synchronized在方法中包含一个块)以保护对共享static集合的访问.

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


Boa*_*ann 62

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

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

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

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

    static void methodC() {
        Object lock = Foo.class;
        synchronized (lock) {
            // ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

static synchronized方法的预期目的是当您希望一次只允许一个线程使用存储在static类变量中的某些可变状态时.

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

  • 帽子......这个话题不明确,我读了你的答案.即使是java doc也没有像你那样给出视线..... (6认同)
  • @AdamBurley 没有这样的语法。它不会编译。 (2认同)

Lui*_*ena 43

简单来说,一个static synchronized方法将锁定类而不是对象,它将锁定类,因为关键字static意味着:"类而不是实例".

关键字synchronized表示一次只能有一个线程访问该方法.
并且static synchronized意思是:

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

  • 另请参阅更多详细信息 - http://www.javatpoint.com/static-synchronization-example (3认同)
  • 最好的一个只有4行:) (2认同)

小智 10

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