Java锁定数组内的元素

时间:2010-01-23 20:16:33

标签: java concurrency

我有哈希表的动态数组

我可以单独为每个使用synchronized吗? 像synchronized(array [1]){code ..},synchronized(array [2]){code ..}

由于

2 个答案:

答案 0 :(得分:3)

您当然可以在数组写入中的特定位置同步对象:

synchronized (arr[x]) {
  ...
}

但是,请务必确保您了解这是否正在按照您的意愿行事。

这将锁定arr [x]引用的特定对象。但是,就访问数组本身而言,它不会为您带来任何线程安全性 - 换句话说,例如:

  • 当您在arr [x]上锁定对象时,另一个线程仍可能更改哪个对象位于arr [x];
  • 如果两个线程同时访问arr的相同位置(要么读取哪个哈希映射/对象,要么设置一个新的),就会出现竞争条件。

我也倾向于同意akappa - 你所做的事情听起来有点不寻常,而且将你的问题改为“为了做X我需要什么数据结构”而不是假设一个数组可能更好从一开始就是一个合适的哈希映射?

答案 1 :(得分:2)

当然,如果可以的话,最好使用concurrent map操作符concurrent skip list来解决吞吐量问题。

顺便说一句,如果您向我们提供一些背景信息,我们可以建议您(可能)更好的数据组织和结构。