线程安全 集合

线程安全指的是该对象的add,remove,get等方法是线程安全的,即同一对象(同一个list),同一时间只有一个线程能在这几个方法上运行,其实针对的是这个集合list 这几种方法内容而言的,如list的add方法,这个add方法里面具体实现肯定有好多条代码,假如一个线程调用add方法,其实是在执行这个add方法里的具体实现的代码,再不停的执行代码过程中,完全有可能有另外一个线程也来执行这个list的add方法,也就是也会进这个list的add方法的具体实现代码中,那这个时候由于对象都是同一个list,而且都是执行的add方法,那可能就会涉及同步问题,那这里线程安全集合就是指 当一个线程在调用 这个集合的add或者remove或get等方法时,其他都线程就不能来调用这个list的这些方法中的任意一个,这样子就能保证数据的稳定性,但这只是集合的原子级别,不能概括了 业务层,所以业务层次仍然要加锁,比如一个线程安全的map,2个线程都来put操作,如果仅仅直接put的话是没问题,因为哪个先调用put,另外一个线程就只能等待调用put,这是没问题的,但假如 2个put操作是建立在一个if条件下,比如如果 是map中套map ,假如 外部的key对应的value即里面的map 不存在才会去new这个里面map然后把这个里面map put到外部map,这个时候就要加锁。

但迭代器不是这样的.每个迭代器实际上都是独立的对象,互相之间是没有办法用锁来同步的(锁只能锁同一个对象),也不能去同步(因为迭代器设计之初就是为了支持多个遍历动作同时存在的).于是,在同一个List的两个不同迭代器在不同线程上分别遍历以及进行remove动作时,就会出现线程不安全的问题.如果要避免这个问题,就要在遍历时用list对象作为同步锁来保证线程安全.

时间: 2024-10-13 06:34:06

线程安全 集合的相关文章

Net线程安全集合

在看Supersocket源码的时候发现很多地方都用到了我们不是很常用的线程安全集合,这些都是由net优化后的线程安全集合因此 应该比我们常规lock来效率好一些 比如说: 1 CurrentStack 线程安全栈 2 ConcurrentDictionary 线程安全字典,

线程安全集合

>>返回<C# 并发编程> 1. 简介 2. 不可变栈和队列 3. 不可变列表 4. 不可变Set集合 5. 不可变字典 6. 线程安全字典 7. 阻塞队列 8. 阻塞栈和包 9. 异步队列 10. 异步栈和包 11. 阻塞/异步队列 1. 简介 不可变集合 不可变集合之间通常共享了大部分存储空间,因此其实浪费并不大 因为是无法修改的,所以是线程安全的 线程安全集合 可同时被多个线程修改的可变集合 线程安全集合混合使用了细粒度锁定和无锁技术,以确保线程被阻塞的时间最短 通常情况下是

Java创建多线程和线程安全集合Vector

public class Test { public static Vector<String> data = new Vector<String>(); public static void main(String[] args) { for (int i = 0; i < 100; i++) { data.add("data" + i); } for (int i = 0; i < 3; i++) { Thread t = new Thread(

JDK5新特性之线程同步集合(五)

一. 传统集合: 传统方式下的Collection在迭代集合时, 不同意对集合进行改动: public class CollectionModifyExceptionTest { public static void main(String[] args) { Collection<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.ad

Java面试题(五)线程及集合补充

1,一个进程就是一个应用程序.一个线程就是一个进程中运行的最小单元.  一个进程可以包括多线程. 餐馆(进程). 主线程. 服务员(线程) 服务员(线程) 服务员(线程) 服务员(线程) 加塞,让步,守护,睡觉,打断,设置优先级.. 2,线程的生命周期?新建,就绪,运行,阻塞,死亡 3,线程创建有几种方式?答:三种.extends Thread,implements Runnable,线程池. 继承是否要满足一种关系?is-a关系?子类 is a 父类. 4,不同线程创建对应的start方法. 

011-多线程-JUC集合-Queue-PriorityBlockingQueue和DelayQueue

一.PriorityBlockingQueue简介 PriorityBlockingQueue是一个支持优先级的无界阻塞队列.默认情况下元素采用自然顺序升序排列.也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序.但需要注意的是不能保证同优先级元素的顺序. 二.DelayQueue DelayQueue是一个支持延时获取元素的无界阻塞队列.队列使用PriorityQueue来实现

012-多线程-JUC集合-Queue-SynchronousQueue和LinkedTransferQueue

一.SynchronousQueue概述 SynchronousQueue是一个不存储元素的队列.每一个put操作必须等待一个take操作,否则不能继续添加元素. 它支持公平访问队列.默认情况下线程采用非公平性策略访问队列.SynchronousQueue类只有两个构造方法: public SynchronousQueue() { this(false); } public SynchronousQueue(boolean fair) { transferer = fair ? new Tran

Concurrent下的线程安全集合淄滋爪篆装状

http://www.ebay.com/cln/zhenbe5/2015-01-28/165564250015 http://www.ebay.com/cln/ainxiacen/2015-01-28/165288136012 http://www.ebay.com/cln/chj3768/2015-01-28/165455877011 http://www.ebay.com/cln/kon-j97/2015-01-28/165564254015 http://www.ebay.com/cln/

Java集合的有序无序问题和线程安全与否问题

首先,清楚有序和无序是什么意思: 集合的有序.无序是指插入元素时,保持插入的顺序性,也就是先插入的元素优先放入集合的前面部分. 而排序是指插入元素后,集合中的元素是否自动排序.(例如升序排序) 1.有序集合:集合里的元素可以根据key或index访问.无序集合:集合里的元素只能遍历.有序集合在属性的增加,删除及修改中拥有较好的性能表现. Set集合一般是无序的.实现hash算法的集合一般是无序的,例如hashMap,hashTable List集合一般是有序的. 底层是Tree的一般是有序的,例