gpt4 book ai didi

java - Java 中的并发性 : synchronized static methods

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:06:29 25 4
gpt4 key购买 nike

我想了解如何在 Java 中对静态方法进行锁定。

假设我有以下类(class):

class Foo {
private static int bar = 0;
public static synchronized void inc() { bar++; }
public synchronized int get() { return bar; }

据我了解,当我调用 f.get() 时,线程会获取对象 f 上的锁,而当我调用 Foo.inc( ) 线程获取类 Foo 上的锁。

我的问题是这两个调用如何相互同步?调用静态方法是否也会获取所有实例化的锁,或者反过来(这似乎更合理)?


编辑:

我的问题不完全是 static synchronized 如何工作,而是静态和非静态方法如何相互同步。即,我不希望两个线程同时调用 f.get()Foo.inc(),但这些方法获取不同的锁。我的问题是这是如何预防的,是否在上面的代码中被预防了。

最佳答案

静态和实例 synchronized 方法彼此不相关,因此您需要在它们之间应用一些额外的同步,如下所示:

class Foo {
private static int bar = 0;
public static synchronized void inc() { bar++; }
public synchronized int get() {
synchronized (Foo.class) { // Synchronizes with static synchronized methods
return bar;
}
}
}

(尽管在这种情况下,在 get() 上保留 synchronized 没有任何意义,因为它不会执行任何需要实例同步的操作)。

当心死锁——由于此代码获取多个锁,它应该以一致的顺序执行,即其他同步静态方法不应尝试获取实例锁。

另请注意,使用原子字段可以在根本不同步的情况下解决此特定任务:

class Foo {
private static AtomicInteger bar = new AtomicInteger(0);
public static void inc() { bar.getAndIncrement(); }
public int get() { return bar.get(); }
}

关于java - Java 中的并发性 : synchronized static methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com