`
20386053
  • 浏览: 433166 次
文章分类
社区版块
存档分类
最新评论

Java并发编程学习笔记之八:多线程环境中安全使用集合API(含代码)

 
阅读更多

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200509


在集合API中,最初设计的Vector和Hashtable是多线程安全的。例如:对于Vector来说,用来添加和删除元素的方法是同步的。如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不必要的时候如果滥用同步化,也有可能会带来死锁。因此,对于更改集合内容的方法,没有一个是同步化的。集合本质上是非多线程安全的,当多个线程与集合交互时,为了使它多线程安全,必须采取额外的措施。

在Collections类 中有多个静态方法,它们可以获取通过同步方法封装非同步集合而得到的集合:

public static Collection synchronizedCollention(Collection c)

public static List synchronizedList(list l)

public static Map synchronizedMap(Map m)

public static Set synchronizedSet(Set s)

public static SortedMap synchronizedSortedMap(SortedMap sm)

public static SortedSet synchronizedSortedSet(SortedSet ss)

这些方法基本上返回具有同步集合方法版本的新类。比如,为了创建多线程安全且由ArrayList支持的List,可以使用如下代码:

List list = Collection.synchronizedList(new ArrayList());

注意,ArrayList实例马上封装起来,不存在对未同步化ArrayList的直接引用(即直接封装匿名实例)。这是一种最安全的途径。如果另一个线程要直接引用ArrayList实例,它可以执行非同步修改。


下面给出一段多线程中安全遍历集合元素的示例。我们使用Iterator逐个扫描List中的元素,在多线程环境中,当遍历当前集合中的元素时,一般希望阻止其他线程添加或删除元素。安全遍历的实现方法如下:

import java.util.*;

public class SafeCollectionIteration extends Object {
	public static void main(String[] args) {
		//为了安全起见,仅使用同步列表的一个引用,这样可以确保控制了所有访问
		//集合必须同步化,这里是一个List
		List wordList = Collections.synchronizedList(new ArrayList());

		//wordList中的add方法是同步方法,会获取wordList实例的对象锁
		wordList.add("Iterators");
		wordList.add("require");
		wordList.add("special");
		wordList.add("handling");

		//获取wordList实例的对象锁,
		//迭代时,阻塞其他线程调用add或remove等方法修改元素
		synchronized ( wordList ) {
			Iterator iter = wordList.iterator();
			while ( iter.hasNext() ) {
				String s = (String) iter.next();
				System.out.println("found string: " + s + ", length=" + s.length());
			}
		}
	}
}

这里需要注意的是:在Java语言中,大部分的线程安全类都是相对线程安全的,它能保证对这个对象单独的操作时线程安全的,我们在调用的时候不需要额外的保障措施,但是对于一些特定的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。例如Vector、HashTable、Collections的synchronizedXxxx()方法包装的集合等。


分享到:
评论

相关推荐

    Java并发编程学习笔记 pdf 多线程编程

    Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...

    Java并发编程学习笔记.rar

    Java并发编程学习笔记

    java并发编程实践笔记

    java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记

    Java并发编程学习笔记

    1、线程安全和锁 Synchronized 底层实现原理 2、可重入锁与 Synchronized 的其他特性 3、ThreadLocal 的底层实现与使用 4、ReentrantLock底层实现和如何使用 5、Condition源码分析 6、ReentrantReadWriteLock底层...

    java并发编程学习笔记

    java并发编程学习笔记,很详细的资料

    java并发编程2

    java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf

    Java并发编程学习笔记.

    Java并发编程学习笔记.

    Java并发编程示例(八):处理线程的非受检异常

    主要介绍了Java并发编程示例(八):处理线程的非受检异常,Java为我们提供了一种机制,专门用于处理由Thread对象抛出的非受检异常,以避免程序的退出,需要的朋友可以参考下

    java并发编程:线程基础

    本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程的创建和管理,以及线程间通信的基本方法。通过深入学习,您将建立扎实的多线程编程基础,能够更好地理解和应用多线程编程。 多...

    java并发编程与实践

    java并发编程与实践是java高并发的分析文档,分析并介绍了高并发的解决方案。

    《Java并发编程的艺术》源代码

    第8章介绍了Java中提供的并发工具类,这是并发编程中的瑞士军刀。 第9章介绍了Java中的线程池实现原理和使用建议。 第10章介绍了Executor框架的整体结构和成员组件。 第11章介绍几个并发编程的实战,以及排查并发...

    java多线程并发编程知识导图笔记.xmind

    java多线程并发编程知识导图笔记.xmind

    Java 高并发多线程编程系列案例代码

    Java 高并发多线程编程系列案例代码 & 教程 & 面试题集锦! !! 包括但不限于线程安全性, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项,

    java多线程笔记

    二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 ...

    13-Java并发编程学习宝典.zip

    13-Java并发编程学习宝典.zip

    Java并发编程示例(六):等待线程执行终止

    主要介绍了Java并发编程示例(六):等待线程执行终止,在本节,示例程序演示等待初始化方法完成后,再去执行其他任务,需要的朋友可以参考下

    java并发编程实战源码,java并发编程实战pdf,Java

    java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea

    JAVA多线程并发编程

    学习并发编程自己总结的知识,非常实用。JAVA学习并发编程的精华

    Java 并发核心编程

    本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发集合类、线程协作摘要、Executors。开发者通过这些基础的接口可以构建高并发、线程...

Global site tag (gtag.js) - Google Analytics