`

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 多线程编程实战指南(核心 + 设计模式 完整版)

    - **ConcurrentHashMap**:线程安全的哈希表,比`synchronized` Map更高效。 - **BlockingQueue**:用于线程间的数据传递,提供阻塞操作,常用于线程池的实现。 - **Atomic类**:提供原子操作,如`AtomicInteger`...

    Java多线程编程

    9. **并发容器**:Java并发包提供了线程安全的容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,它们在多线程环境下保证了数据的一致性和正确性,减少了同步的开销。 10. **线程优先级**:Java中的线程有...

    Java多线程练习题

    Java提供了一系列并发容器,如ConcurrentHashMap、CopyOnWriteArrayList等,它们内部实现了线程安全,能够在多线程环境下高效地使用。 八、死锁 当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生...

    java多线程进阶

    9. **并发编程最佳实践**:书中可能还会提供一些并发编程的最佳实践,包括如何编写线程安全的代码、如何处理并发异常、如何进行单元测试等。 通过深入学习这本书,开发者不仅能理解Java多线程的底层机制,还能掌握...

    java多线程并发实战和源码

    这些容器内部实现了线程安全的算法,能够在高并发环境下提供高效的数据访问。 此外,Java并发工具类(java.util.concurrent包)提供了许多实用的工具,如ExecutorService、Future、CountDownLatch、CyclicBarrier和...

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

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

    servlet线程安全问题

    Servlet 线程安全问题 Servlet 线程安全问题是指在使用 Servlet 编程时,如果不注意多线程安全性问题,可能会导致难以发现的错误。Servlet/JSP 技术由于其多线程运行而具有很高的执行效率,但这也意味着需要非常...

    java多线程编程

    线程同步是解决线程间共享数据时可能出现的问题,如死锁、活锁和饥饿,Java提供了`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`Lock`接口(如`ReentrantLock`)来实现线程安全。...

    Java容器总结

    在IT领域,Java容器是一个非常重要的概念,尤其对于软件开发者来说,它们是理解和构建高效、可扩展的应用程序的关键。本文将深入探讨Java容器,并结合标签“源码”和“工具”,从源码层面和实用工具角度来分析这些...

    java 多线程编程指南

    Java提供了synchronized关键字来实现线程安全,它可以修饰方法或代码块,确保同一时间只有一个线程能访问特定的代码。此外,还有volatile关键字,用于确保变量的可见性和有序性,防止数据的不一致。 死锁是多线程...

    Java多线程编程模板

    Java集合框架提供了线程安全的容器,如Vector、Collections.synchronizedList()、ConcurrentHashMap等,它们在多线程环境下自动进行同步。 总之,Java多线程编程是高效利用系统资源、提升程序性能的重要手段。理解...

    Java多线程与线程安全实践-基于Http协议的断点续传

    4. **并发容器**:Java集合框架中的Concurrent包提供了线程安全的容器,如ConcurrentHashMap和CopyOnWriteArrayList,它们在内部实现了线程安全的算法,使得并发操作无需额外的同步措施。 现在,我们转向基于HTTP...

    java多线程多人聊天系统

    Java提供了wait()、notify()和notifyAll()等方法,以及BlockingQueue等并发容器来实现线程间的通信。在聊天系统中,服务器线程可能需要通过这些机制通知用户线程有新消息到达。 4. **异常处理**:多线程环境下,每...

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    5. **并发容器**:Java并发库还提供了一些线程安全的集合类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,这些容器可以在高并发场景下安全地使用。 通过以上知识点的学习,开发者可以深入理解Java多线程编程...

    java多线程面试题59题集合

    以上只是Java多线程面试中可能会遇到的一部分问题,实际的59题集合可能涵盖更多细节和深度,包括线程安全的类、线程通信的高级技术、并发设计模式等。掌握这些知识点,不仅有助于应对面试,更能提高在实际开发中处理...

    Java多线程编程中数据安全的应用研究 (1).pdf

    "Java多线程编程中数据安全的应用研究" 本文研究的主要目的是探讨Java多线程编程中数据安全的问题。Java多线程编程是当前软件开发中最重要的技术之一,它能够充分利用多处理器技术提高程序的执行效率和系统资源的...

    java自定义线程模型处理方法分享

    可以使用`java.util.concurrent`包中的线程安全容器,如`ConcurrentHashMap`、`BlockingQueue`等,以及`synchronized`关键字或`Lock`接口来实现同步。 6. **异常处理**:当线程中发生异常时,需要有适当的处理机制...

    Java多线程编程的线程安全性.docx

    Java提供了多种并发工具和机制,如synchronized、volatile、java.util.concurrent包下的各种并发容器,以及ReentrantLock、Semaphore等,帮助开发者实现线程安全的代码。在编写多线程代码时,应该根据具体需求选择...

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

    在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗...

    Java线程(第三版)

    最后,线程安全的数据结构和并发容器,如`Atomic`类、`CopyOnWriteArrayList`和`ConcurrentLinkedQueue`,它们提供了一种线程安全的方式来操作共享数据,避免了同步带来的开销。 总之,《Java线程(第三版)》全面...

Global site tag (gtag.js) - Google Analytics