gpt4 book ai didi

java - 同步静态方法

转载 作者:行者123 更新时间:2023-11-30 07:40:05 29 4
gpt4 key购买 nike

我正在编写需要在几个静态方法之间进行某种同步的代码。我的目标是在其中一个方法执行时阻止这些方法中的任何一个的执行。例如:

public class Foo{

static Object lock = new Object();
static List<SomeObject> listOfObjects = new ArrayList<>() ;


public static void methodA() {
synchronized (lock) {
//Do some stuff
methodB();
}
}

public static List<SomeObject> methodB() {
synchronized (lock) {
//Do some stuff
return listOfObjects;
}
}

}

现在让我们假设以下代码是从代码中的某处执行的:

Foo.methodA();
Foo.methodB();

我的问题是:

  1. 它真的是同步的吗? methodA 和 methodB 不会同时运行吗?

  2. 如果是这样,methodA 调用 methodB 是否会造成死锁?

最佳答案

答案:

  1. “真的同步了吗?methodA和methodB不会运行并发?” - 是的,这些方法是同步的。更准确地说,方法中的代码块是同步的。
  2. “如果是这样,方法 A 调用方法 B 会造成死锁吗?” - 不,synchronized 关键字本质上是可重入的 这意味着如果一个同步方法调用另一个需要相同锁的同步方法,那么持有锁的当前线程可以进入那个无需获取锁的方法”- 来自 1

您可以通过提供 privatefinal 关键字来稍微改进代码:

private static final Object lock = new Object();

此外,不要返回对要保护的 List 的直接引用。返回只读 View :

return Collections.unmodifiableList(listOfObjects);

从现在开始,客户端只有read only 访问权限,可以保护您免受许多意外情况的影响。

  1. Static versus non-static lock object in synchronized block
  2. Object level lock vs Class level lock in Java

关于java - 同步静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58277884/

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