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

在集合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实例,它可以执行非同步修改。

 

import java.util.*;public class SafeCollectionIteration extends Object {public static void main(String[] args) {//为了安全起见,仅使用同步列表的一个引用,这样可以确保控制了所有访问//集合必须同步化,这里是一个ListList 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());}}}
}

  

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

 

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

 

转载于:https://www.cnblogs.com/xiaotao726/p/5521682.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iptables nat表含义_十(4)iptables语法、iptables filter表小案例、iptables nat表应用

iptables语法filter表:INPUT链:作用于进入本机的包OUTPUT链:作用于送出本机的包FORWARD链:作用于和本机无关的包nat表:PREROUTING链:作用是包在刚刚到达防火墙时改变包的目标地址OUTPUT链:改变本…

c语言Max错误,C语言编程常见错误.pdf

C 语言常见错误版权声明:以下内容来自互联网C 语言的最大特点是:功能强、使 方便灵活。C 编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下 “灵活的余地”,但还是由于这个灵活给程序的调试带来了许多不便&…

算法训练 连续正整数的和

问题描述78这个数可以表示为连续正整数的和&#xff0c;123&#xff0c;18192021&#xff0c;252627。输入描述输入一个正整数 n(<10000)输出描述输出 m 行(n有m种表示法)&#xff0c;每行是两个正整数a&#xff0c;b&#xff0c;表示a(a1)...bn。对于多种表示法&#xff0c…

android libev 编译,libev-4.20编译安装及简单使用

1.源码下载地址:链接&#xff1a;https://pan.baidu.com/s/1fxotILo3oTMC65z4qFAh9Q 密码&#xff1a;oc312.库的编译与安装解压文件&#xff0c;进入文件目录编译的时候需要首先切换为管理员(root)账户&#xff0c;然后执行以下命令&#xff1a;./configuremakemake install编…

android系统源码的环境下用make来编译,Android源码编译系统入门

做过 Android 平台开发的朋友对make&#xff0c;mm或make clean命令应该很熟悉&#xff0c;但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理&#xff1f;那么今天我就带着大家推开Android编译系统的大门&#xff0c;探索一下这片未知的恐怖之森(问啥要用恐怖…

bootsrap 外边距_Bootstrap CSS 概览

Bootstrap CSS 概览在这一章中&#xff0c;我们将讲解 Bootstrap 底层结构的关键部分&#xff0c;包括我们让 web 开发变得更好、更快、更强壮的最佳实践。HTML 5 文档类型(Doctype)Bootstrap 使用了一些 HTML5 元素和 CSS 属性。为了让这些正常工作&#xff0c;您需要使用 HTM…

jstl表达式替换某些字符

转自:http://www.yiibai.com/jsp/jstl_function_replace.html fn:replace() 函数替换一个字符串与另一个字符串的所有匹配。 语法 fn:replace () 函数语法如下&#xff1a; boolean replace(java.lang.String, java.lang.String, java.lang.String) 例子&#xff1a; 下面是一个…

android socket 闪退,android客户端闪退

老师&#xff0c;我把客户端的代码放在android程序里&#xff0c;给一个button监听事件&#xff0c;就是调用这个socket方法&#xff0c;但是一点button就闪退了&#xff0c;没连接上~protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState)…

(mac)阿里云ECS服务器配置过程

-----首先本人是半只脚入门的iOS开发者&#xff0c;弄这个只是单纯想多学点东西。 -----阿里云服务器的配置选择&#xff1a;既然是学习用的&#xff0c;最最基础的配置就行了。1M带宽&#xff0c;1核1G...这就不详述了。没啥可选的&#xff0c;&#xff08;其中有个创建实例&a…

android 换到iphone,从安卓换到苹果到底是什么感受?最后一个让我彻底放弃了iPhone!...

原标题&#xff1a;从安卓换到苹果到底是什么感受&#xff1f;最后一个让我彻底放弃了iPhone&#xff01;iPhone X是近几年来苹果最具创新力的iPhone&#xff0c;然而高昂的售价让很多消费者望而却步。随着今年苹果秋季新品发布会的临近&#xff0c;苹果即将发布价格更低廉&…

mac谷歌浏览器怎么登陆账户_mac怎么下chrome浏览器

mac怎么下chrome浏览器&#xff1f;首先打开Safari浏览器百度搜一下谷歌浏览器官网&#xff0c;进入官网页面下载或者也可以直接打开下面的网址进入官网https://www.google.cn/intl/zh-CN/chrome/点击网页上的”下载Chrome“弹出提示&#xff0c;选择”接受并安装“等待软件下载…

php 5.5 xhprof for windows

今天看到一个好的性能优软件xhprof&#xff08;有facebook开发的类库)在国内找了很多网站都没有找到相关php5.5的扩展&#xff0c;只好FQ还是外面的世界精彩一下就找到了link (http://windows.php.net/downloads/pecl/releases/xhprof/0.10.6/)如果不能FQ的小伙伴可以到我的百度…

鸿蒙分布式体验,一张图看懂鸿蒙OS 2.0 分布式能力升级构筑全场景体验

原标题&#xff1a;一张图看懂鸿蒙OS 2.0 分布式能力升级构筑全场景体验【手机中国新闻】9月10日下午&#xff0c;华为召开HDC2020大会&#xff0c;全新的HarmonyOS 2.0正式发布。新系统的分布式能力全面升级&#xff0c;同时还为开发者提供了完整分布式设备与应用开发生态&…

怎么卸载python 旧版本_Python 如何移除旧的版本特性,如何迎接新的特性?

2020 年 4 月 20 日&#xff0c;Python 2 的最后一个版本 2.7.18 发布了&#xff0c;这意味着 Python 2 是真正的 EOL(end of life)了&#xff0c;一个时代终于落幕了。Python 2.0 版本是在 2000 年发布的&#xff0c;至今正好到 20 周年(差半年)&#xff0c;一代版本竟然持续了…

如何在android模拟器中安装apk

1. 启动android模拟器 2. 将要安装的apk&#xff0c;拷贝在与adb.exe同文件夹中。我的路径&#xff1a;D:\android\android-sdk-windows\platform-tools 3. 在cmd中&#xff0c;进入上目录&#xff0c;输入adb install xxx.apk&#xff0c;最后可看见success 4. 回到android模拟…

android 本地图片分享,Android 把图片保存到本地相册

【实例简介】把图片保存到本地相册,实现本地相册资源同步化【实例截图】【核心代码】Scanner└── Scanner├── AndroidManifest.xml├── bin│ ├── AndroidManifest.xml│ ├── classes│ │ └── com│ │ └── housheng│ │ └── scanner│…

python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点

前言在《设计模式》一书中工厂模式提到了&#xff1a;工厂方法模式(Factory Method)抽象工厂模式 (Abstract Factory)但是在实际过程中还有一种工厂模式经常被使用&#xff0c;那就是 简单工厂模式(SimpleFactory)。有一种常见的分类的方法&#xff1a;根据产品是由具体产品还是…

LaTeX 的对参考文献的处理

LaTeX 的对参考文献的处理实在是非常的方便&#xff0c;我用过几次&#xff0c;有些体会&#xff0c;写出来供大家 参考。当然&#xff0c;自己的功力还不够深&#xff0c;有些地方问题一解决就罢手了&#xff0c;没有细究。LaTeX 对参考文献的处理有这么一些优点&#xff1a;1…

android 拦截外拨电话,Android拦截外拨电话程序示例

拦截监听外拨的电话,并进行处理:向外拨打电话时系统会发出一个有序广播&#xff0c;虽然该广播最终会被拔号器里的广播接收者所接收并实现电话拔打&#xff0c;但我们可以在广播传递给拔号广播接收者之前先得到该广播&#xff0c;然后清除传递给拔号广播接收者的电话号码&#…

linux下达梦数据库启动_linux上安装tomcat和达梦数据库

环境&#xff1a;系统&#xff1a;红帽linux企业版4(红旗LINUX也是一样&#xff0c;会更简单)jakarta-tomcat-5.0.28.tar.gz(二进制源码)jdk-1_5_0_15-linux-i586-rpm.bin(RPM包)达梦数据库目的&#xff1a;大部分政分机关&#xff0c;大型企事业单位都用LINUX作为服务器&#…