gpt4 book ai didi

Java:如何同步数组访问以及同步条件下的限制是什么

转载 作者:搜寻专家 更新时间:2023-10-30 21:46:17 25 4
gpt4 key购买 nike

我有一个 2x2 数组,我有两个线程在上面运行。

可以在数组上使用 java 中的同步语句吗?

锁定是如何工作的? Java 教程线程说同步语句适用于对象,所以我不确定它们是什么意思。另一个网站说我可以发表这样的声明

synchronized (array1[]){

}

这是否同步访问数组中的所有内容,以便该数组被其他线程锁定?

如果我有一个二维数组我可以使用吗

synchronized (array1[i]) 锁定数组的其中一行?

是否可以锁定单个数组值用类似的东西

synchronized (array1[i][j]){

}

但是,非常感谢提示或帮助。其实我已经上交了,不管正确与否。但我想知道以备将来使用

最佳答案

是的,您可以使用数组作为监视器对象进行同步,因为数组(甚至基元数组)是 Java 中的对象。

您可以像这样在特定监视器上同步代码块:

public void myMethod() {

unsynchronized_statements...

synchronized(myMonitorObject) {
synchronized_statments...
}

最佳做法是同步尽可能少的代码行。

在监视器上同步代码不会以任何方式影响监视器,它只会影响访问同步代码块的线程。在线程执行进入代码块之前,它必须获得监视器上的“锁”。 Java 运行时确保一次最多一个线程可以在监视器上“锁定”。 所以同步你的数组并不会禁止未同步的代码块访问它!诀窍是确保你不想同时发生的所有操作都在同步的 block 中同一台显示器。

由于 Java 不提供多维数组,仅提供数组的数组,因此您当然可以在嵌套数组上进行同步以实现更细粒度的同步。如果将二维数组建模为行数组,则只能在行上同步,而不能在列上同步,因为在该示例中,列未表示为单独的数组。

您只能在非原始数组值上进行同步,因此使用 Integer() 而不是 int。请注意,Integer() 是一个不可变对象(immutable对象),因此您无法更改它的值。一种解决方案是创建您自己的 Cell() 包装器对象,其中包含数值的 getter 和 setter。这将允许您让线程锁定 Cell 并安全地更改其值。

因为今天是我的休息日,所以我决定找点乐子,并根据您的描述创建了一个工作示例。是的,这就是我的乐趣。

类:

应用程序在同一个矩阵上启动多个操作。唯一同步的代码块在类 Operation 中。如果删除同步,结果将是错误的,因为两个操作同时操作同一行。

同步时的输出:

[105, 104, 103, 102, 101]
[110, 109, 108, 107, 106]
[115, 114, 113, 112, 111]
[120, 119, 118, 117, 116]
[125, 124, 123, 122, 121]
[130, 129, 128, 127, 126]
[135, 134, 133, 132, 131]
[140, 139, 138, 137, 136]
[145, 144, 143, 142, 141]
[150, 149, 148, 147, 146]

不同步时的示例输出:

[105, 4, 103, 102, 101]
[110, 9, 108, 207, 106]
[115, 14, 113, 212, 111]
[120, 19, 118, 217, 116]
[125, 124, 123, 122, 121]
[130, 129, 128, 127, 126]
[135, 34, 133, 232, 131]
[140, 139, 138, 137, 136]
[145, 144, 143, 142, 141]
[150, 149, 148, 147, 146]

请注意,我在操作实现中添加了一些 Thread.sleep() 语句,以使同步和非同步执行之间的区别更加明显。

关于Java:如何同步数组访问以及同步条件下的限制是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7351073/

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