转自: 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中的元素,在多线程环境中,当遍历当前集合中的元素时,一般希望阻止其他线程添加或删除元素。安全遍历的实现方法如下:

 1 import java.util.*;
 2
 3 public class SafeCollectionIteration extends Object {
 4     public static void main(String[] args) {
 5         //为了安全起见,仅使用同步列表的一个引用,这样可以确保控制了所有访问
 6         //集合必须同步化,这里是一个List
 7         List wordList = Collections.synchronizedList(new ArrayList());
 8
 9         //wordList中的add方法是同步方法,会获取wordList实例的对象锁
10         wordList.add("Iterators");
11         wordList.add("require");
12         wordList.add("special");
13         wordList.add("handling");
14
15         //获取wordList实例的对象锁,
16         //迭代时,阻塞其他线程调用add或remove等方法修改元素
17         synchronized ( wordList ) {
18             Iterator iter = wordList.iterator();
19             while ( iter.hasNext() ) {
20                 String s = (String) iter.next();
21                 System.out.println("found string: " + s + ", length=" + s.length());
22             }
23         }
24     }
25 }  

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

转载于:https://www.cnblogs.com/lt132024/p/6442826.html

多线程环境中安全使用集合API(含代码)相关推荐

  1. Java并发编程(8):多线程环境中安全使用集合API(含代码)

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  2. 【Java并发编程】之八:多线程环境中安全使用集合API

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  3. JAVA并发七(多线程环境中安全使用集合API)

    在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对 ...

  4. dateformat线程_Java最佳实践–多线程环境中的DateFormat

    dateformat线程 这是有关使用Java编程语言时的拟议实践的系列文章的第一篇. 所有讨论的主题均基于用例,这些用例源于电信行业关键任务超高性能生产系统的开发. 在阅读本文的每个部分之前,强烈建 ...

  5. Java最佳实践–多线程环境中的DateFormat

    这是有关使用Java编程语言时的拟议实践的系列文章的第一篇. 所有讨论的主题均基于用例,这些用例来自于电信行业的关键任务超高性能生产系统的开发. 在阅读本文的每个部分之前,强烈建议您参考相关的Java ...

  6. c语言popen函数多线程,关于多线程:多线程环境中的Python-Subprocess-Popen行为不一致...

    我在线程内部运行以下代码.." executable"为每个输入" url"产生唯一的字符串输出: p = Popen(["executable&qu ...

  7. 多线程环境中lock.trylock方法争抢锁

    在多线程或分布式环境中,经常需要用到锁,trylock有两种用法,一种是不带参数:不设置等待时间,获取失败立即返回false.另一种是带等待时间的,线程会先挂起等待设置的时间结束如果还未获取到锁则返回 ...

  8. Java中对List集合api展示

    目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引 ...

  9. java中mkdirs_java – 多线程环境中的mkdirs()函数

    我正在创建文件和文件夹树.我正在改写多线程.我看到的唯一弱点是创建文件夹时.现在它一个接一个(深入).在我写下文件之前,我会检查路径是否存在.如果没有,我使用mkdirs来创建所有缺失的东西. pub ...

最新文章

  1. java.net.UnknownHostException: unknown host:xxxx异常解决办法
  2. java开发名言_程序员名言语录
  3. cms-幻灯片的实现
  4. 隐藏oracle数据库,如何隐藏Oracle密码
  5. 华硕重装后进入bios_华硕笔记本重装系统后直接进入bios,怎么办
  6. 为什么 SQL 正在击败 NoSQL,这对未来的数据意味着什么?
  7. SUSE10下配置FTP服务
  8. 【hortonworks/registry】创建嵌套结构的scheam和带空值的schema
  9. 挣扎 7 年,苹果 Siri 还是被“抛弃”了
  10. OpenGL ES应用开发实践指南:iOS卷
  11. [PHP] - Laravel 5 的 Hello Wold
  12. php 伪静态 获取当前页面路径_php url伪静态过程详解
  13. 求教务排课系统(eclipes和MSQL)!
  14. android实现半透明,Android应用开发中半透明效果实现方案总结
  15. web前端笔试题-完善版
  16. linux学习资料(转帖收藏)
  17. 程序员的终极幻想(三):做一只小小的蜗牛
  18. 换了一把椅子之后才知道,原来人体工学可以这么香。
  19. 安卓工具类集合—— 1 时间、时间戳转换工具
  20. 人工智能数学基础:费马引理、罗尔定理、拉格朗日微分中值定理、柯西中值定理

热门文章

  1. AHOI2013 Round2 Day2 简要题解
  2. 中文字符串提交乱码的解决方法
  3. TP5 MYSQL按照原来的IN顺序查询
  4. 枚举类型enum用法_Java枚举深度解读,看这篇就够了
  5. 3.PHP条件语句及其字符串相关函数
  6. hdu5256序列变换(非递减子序列)
  7. 【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )
  8. 【BLE MIDI】MIDI 文件格式分析 ( FF 03 轨道名称 | FF 51 03 四分音符时长 )
  9. 【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  10. 【网络安全】网络安全攻防 -- 黑客攻击简要流程