首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中安全地访问数组线程?

如何在Java中安全地访问数组线程?
EN

Stack Overflow用户
提问于 2015-03-19 11:32:45
回答 3查看 3.1K关注 0票数 5

Java线程中的数组操作安全吗?

如果不是,那么如何使Java中的数组线程在读写过程中都是安全的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-19 11:37:09

在java中对数组进行操作并不是线程安全。相反,您可以将ArrayListCollections.synchronizedList()结合使用。

假设我们正在尝试填充字符串的同步ArrayList。然后你可以将项目添加到列表中,比如-

代码语言:javascript
运行
AI代码解释
复制
List<String> list = 
         Collections.synchronizedList(new ArrayList<String>());

       //Adding elements to synchronized ArrayList
       list.add("Item1");
       list.add("Item2");
       list.add("Item3"); 

然后从这样的synchronized块中访问它们-

代码语言:javascript
运行
AI代码解释
复制
synchronized(list) {
       Iterator<String> iterator = list.iterator(); 
       while (iterator.hasNext())
       System.out.println(iterator.next());
}  

或者您可以使用ArrayList - CopyOnWriteArrayList的线程安全变体。一个很好的例子可以找到这里

希望能帮上忙。

票数 4
EN

Stack Overflow用户

发布于 2015-03-19 11:37:27

使用多个线程更改数组时,不会获得无效状态。但是,如果某个线程已编辑了数组中的值,则无法保证另一个线程将看到更改。对于非易失性变量也会出现类似的问题。

票数 5
EN

Stack Overflow用户

发布于 2015-03-19 11:38:05

数组操作不是线程安全。您可以锁定一个字段,我建议添加一个字段,例如,命名锁,然后执行

代码语言:javascript
运行
AI代码解释
复制
void add(){
 syncronized(LOCK) {
  // add
 }
}

void get(int i){
 synchronized(LOCK){ 
   // return
 }
}

或者简单地使用

代码语言:javascript
运行
AI代码解释
复制
java.util.concurrent.*
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29153404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档