`

Java的容器的线程安全

 
阅读更多

http://blog.sina.com.cn/s/blog_5efa3473010129pw.html

 

 

线程安全:多个线程操作容器的时候,互相之间不会带来意想不到的影响;

 

 

 

有些容器是线程安全的(Vector,ConcurrentLinkedQueue等),有些则不是(list等),利用类似 private static List<Task> taskQueue = Collections.synchronizedList(new LinkedList<Task>());的方法可以得到本身不是线程安全的容易的线程安全的状态,但是要注意的是线程安全仅仅指的是如果直接使用它提供的函数,比如:queue.add(obj); 或者 queue.poll(obj);,这样我们自己不需要做任何同步。
但如果是非原子操作,比如:
   1. if(!queue.isEmpty()) {  
   2.    queue.poll(obj);  
   3. }  

我们很难保证,在调用了isEmpty()之后,poll()之前,这个queue没有被其他线程修改。
所以对于这种情况,我们还是需要自己同步:
   1. synchronized(queue) {  
   2.     if(!queue.isEmpty()) {  
   3.        queue.poll(obj);  
   4.     }  
   5. }  

对于Collections.synchronizedList(new LinkedList<Task>()),

 

在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:

 List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }

 

不遵从此建议将导致无法确定的行为

分享到:
评论

相关推荐

    java 多线程设计模式 进程详解

    非线程安全的类 总结 第九章 多处理器机器上的并行化 单线程程序并行化 内层循环线程化 循环输出 多处理器扩展 总结 第十章 线程组 线程组概念 创建线程组 线程组方法 操作线程组 线程组、线程和安全 总结

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    线程安全容器   同步容器   并发容器   阻塞队列 高级线程协作工具   信号量   闭锁   关卡 fork-join Executor部分   Executor基础 ThreadPoolExecutor的定制   线程的中断与任务的取消   其他

    java线程和容器专题课程第一部分

    java线程和容器专题课程第一部分,共两部分。详细讲解java线程的一些知识和技术原理。...在多线程中,一般对于static用的比较多,其特殊性起到了共享数据的作用,而Random提供了随机数且它是线程安全的。

    Java多线程实现生产者消费者

    编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。

    Java里线程安全的有界容器的实现

     具体生产实践的时候,对于我来说我是不推荐程序员们直接使用这些的,JAVA1.5之后提供很多直接可用的线程安全的容器,能少写代码少些代码,降低了测试的需求,  也减少出错的可能性。  2. 一个线程安全的容量...

    Java容器.xmind

    线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。 Collections 标记: 均以synchronized实现, 性能没用提高 synchronizedCollection synchronizedList synchronizedSet synchronizedMap ...

    think in java线程和容器2

    java线程中容器使用技术,比如List接口是在Collection的基础上添加了大量方法,有两种基本类型:ArrayList,它擅⻓于随机访问元素,但是List中间插入或移除元 素时较慢;LinkedList,它和ArrayList的特性正好相反。...

    线程安全队列Queue

    在项目启动时,开一个单线程来专门处理巡检任务的下发给巡检服务组件。使用BlockingQueue阻塞算法。BlockingQueue作为线程容器,可以为线程同步提供有力的保障。

    java多线程机制 -- 源码详解

    java多线程机制: 例子 1 public class Example1 { static Lefthand left;static Righthand right; public static void main(String args[]) { left=new Lefthand(); //创建两个线程。 right=new Righthand();...

    Java 常见并发容器总结

    - **`CopyOnWriteArrayList`** : 线程安全的 `List`,在读多写少的场合性能非常好,远远好于 `Vector`。 - **`ConcurrentLinkedQueue`** : 高效的并发队列,使用链表实现。可以看做一个线程安全的 `LinkedList`,这...

    JAVA面试题汇总(基础、容器、多线程等等).docx

    JAVA面试题汇总(基础、容器、多线程等等)

    Java多线程编程中的两种常用并发容器讲解

    主要介绍了Java多线程编程中的两种常用并发容器讲解,分别是ConcurrentHashMap与ConcurrentHashMap,需要的朋友可以参考下

    Java容器

    Java容器 有两种容器:一个是Collection容器,存放对象的集合;另一种是Map容器,存放键值对(Key-value)集合 Collection容器 从图上我们可以看到Collection接口下有三个儿子,分别是Set,List,Queue;下面我来逐个...

    Java中多线程的使用线程池.docx

    线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 * 使用多线程的好处: 1.降低消耗,减少了创建和销毁线程的次数,每个线程都可以重复利用,可执行多个任务 2.提高...

    多线程精品资源--Java教程,包括多线程,泛型,反射,IO,容器类,注解.zip

    多线程精品资源--Java教程,包括多线程,泛型,反射,IO,容器类,注解

    Java容器类List、ArrayList、Vector及map、HashTable应用

    List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 使用容器排序 Vector由于使用了synchronized方法(线程安全)

    java集合类原理面试题

    Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组的? ...

    JavaTutorial, Java教程,包括多线程,泛型,反射,IO,容器类,注解.zip

    JavaTutorial, Java教程,包括多线程,泛型,反射,IO,容器类,注解

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    深入理解Java线程编程中的阻塞队列容器

    阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 阻塞队列提供了四种处理方法: 抛出异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Queue full”)异常。当队列...

Global site tag (gtag.js) - Google Analytics