39、集合线程安全问题

  由于Set、List和Map都是线程不安全的,为了同步控制,Collections类提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题,例如:

  

 1 public class Test {
 2
 3     public static void main(String[] args) {
 4
 5          Collection c=Collections.synchronizedCollection(new ArrayList());
 6          List list=Collections.synchronizedList(new ArrayList());
 7          Set set=Collections.synchronizedSet(new HashSet());
 8          Map map=Collections.synchronizedMap(new HashMap());
 9     }
10 }
时间: 2024-11-06 22:20:51

39、集合线程安全问题的相关文章

08 Java 集合的线程安全问题

1 Java中的集合 Java中的集合分为同步的集合(线程安全)和线程不安全的集合 例如 : ArrayList和Vector的区别: 一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList默认增长为原来的1.5倍 HashMap和Hashtable的区别   一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进

Core Data 的线程安全问题

前言: 很多小的App只需要一个ManagedContext在主线程就可以了,但是有时候对于CoreData的操作要耗时很久的,比如App开启的时候要载入大量数据,如果都放在主线程,毫无疑问会阻塞UI造成用户体验很差.通常的方式是,主线程一个ManagedContext处理UI相关 的,后台一个线程的ManagedContext负责耗时操作的,操作完成后通知主线程.使用CoreData的并行主要有两种方式: Notificaiton child/parent context 何时会使用到后台或者

List 集合线程安全测试

最近在做一些代码整理工作,涉及到List 线程安全问题,查了一些资料.网上有些资料说List 增减成员(Add , Remove) 是安全的,但不保证成员属性值访问安全性,及禁止对 List 跨线程遍历访问, 如 foreach 遍历.可以想象,有些跨线程操作(Add , Remove)List 集合时, 恰好 另一个线程正在通过 foreach遍历, 这时会抛出异常) . 有改进方案用 for 替代 foreach ,这样仍会报下标越界错误.因此 , 跨线程遍历list 不安全毋庸置疑. 对L

《day15---多线程安全问题_JDK1.5的锁机制》

1 //15同步问题的分析案例以及解决思路 2 3 //两个客户到一个银行去存钱,每个客户一次存100,存3次. 4 //问题,该程序是否有安全问题,如果有,写出分析过程,并定于解决方案. 5 6 /* 7 发现运行结果: 8 sum=200 9 sum=200 10 sum=300 11 sum=400 12 sum=600 13 sum=500 14 15 打印错乱,不关心,但是发现数值错误,没有100. 16 运行了几次,发现有对的. 17 18 19 20 说明多线程的随机性造成了安全问

springmvc线程安全问题

对于使用过SpringMVC和Struts2的人来说,大家都知道SpringMVC是基于方法的拦截,而Struts2是基于类的拦截.struct2为每一个请求都实例化一个action所以不存在线程安全问题,springmvc默认单例请求使用一个Controller,假如这个Controller中定义了静态或者实例变量,就会被多个线程共享.所以springmvc的controller不要定义静态变量和实例变量.如果要使用可以用ThreadLocal或者@Scope("prototype"

Parallel线程安全问题

废话不多说,上代码: using System; using System.Collections.Generic; using System.Threading.Tasks; namespace ParallelTest { class Program { static void Main(string[] args) { List<Product> products = new List<Product>(); Parallel.For(0, 1000000, (i) =>

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用

目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,NSOperation 线程安全问题 NSThread的使用 GCD的理解与使用 NSOperation的理解与使用 Demo在这里:WHMultiThreadDemo Demo的运行gif图如下: 一.多线程的基本概念 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作

【C#复习总结】探究各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字

前言 先普及一下线程安全和类型安全 线程安全: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题. 线程安全问题都是由全局变量及静态标量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量

java线程安全问题之静态变量、实例变量、局部变量

Java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定义,如:"一个类在可以被多个线程安全调用时就是线程安全的". 此处不赘述了,首先给出静态变量.实例变量.局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟! 静态变量:线程非安全. 静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态