gpt4 book ai didi

超过 1 个对象的 java 同步块(synchronized block)?

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

我有两个数组,我需要跨线程同步访问它们。我将把它们放在同步块(synchronized block)中。问题是,我只能一次将其中一个传递给“同步”。

如何确保对两个数组的访问是同步的?我是否将它们放在一个类中并创建一个对象?或者我只在同步块(synchronized block)中访问另一个数组,这会处理对它的同步访问?

谢谢,

最佳答案

无论你做什么,都不要这样做:

synchronized (array1) {
synchronized (array2) {
// do stuff
}
}

这很可能导致deadlock除非你非常小心。如果您采用这种方法,则必须确保对象的偏序不变 - Google“Dining Philosophers”以讨论陷阱。

基本上,您需要做的是创建一个锁对象,如果您想要访问任一 数组,然后将其用于所有 数组访问,您将使用该对象。它是粗粒度但安全的。你可以这样做:

public static class TwoArrays {
private int[] array1 = ...
private int[] array2 = ...
private final Object LOCK = new Object();

public void doUpdate() {
synchronized (LOCK) {
...
}
}
}

如果您需要更细粒度的方法,您希望使用 Java 5+ 并发实用程序,例如 ReadWriteLock但这将更复杂且容易出错。

关于超过 1 个对象的 java 同步块(synchronized block)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1851555/

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