【JAVA并发编程实战】3、同步容器

 

 

  同步容器包括Vector和Hashtable,还有一些由Collections.synchronizedXxx等工厂方法创建的

 

1、同步容器类的问题

同步容器类都是线程安全的,但是有些时候还是要客户端加锁来保护复合操作

 

就比如vector的操作,如果又两个方法一个获取vector集合的最后一个元素,一个删除最后一个元素

那么可能两个线程在同时操作的时候,A线程首先正在获取最后一个元素,get(lastElement),而在这个过程中如果B元素正在删除,删除了最后一个(last)然后就可能导致A线程执行失败,报错

 

那么如何避免这个问题呢?

那就是吧获取最后一个位置的索引和获取数据复合操作加锁,使其成为一个原子操作。同理获取索引和删除也是加锁,把容器类作为锁的对象

 

2、隐藏迭代器

如下

package cn.xf.cp.ch05;import java.util.HashSet;
import java.util.Random;
import java.util.Set;public class HiddenIterator
{private final Set<Integer> set = new HashSet<Integer>();//添加与删除操作public synchronized void add(Integer i) { set.add(i); }public synchronized void remove(Integer i) { set.remove(i); }public void addTenThings(){Random r = new Random();for(int i = 0; i < 10; ++i){add(r.nextInt());}//注意这里可能会抛出异常,因为这里使用了set,但是没有加锁,也就是应该加上HiddenIterator的对象锁才可以//而在输出日志的时候,我们的set会调用toString方法,而这个方法会对容器进行迭代//也就是在调用toString方法的时候可能set会被修改,而迭代器在迭代的时候如果计数器被修改那么hasNext或next//将抛出ConcurrentModificationException异常System.out.println("DEBUG: added ten elements to " + set);}
}

 

转载于:https://www.cnblogs.com/cutter-point/p/5998491.html

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

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

相关文章

php 动态加载html内容_ThinkPHP5.1+Swoole实现的开源内容管理框架

一款支持Swoole的开源内容管理框架&#xff0c;基于ThinkPHP5.1开发&#xff0c;同时支持PHP-FPM和Swoole双模式&#xff0c;让WEB开发更快!主要特性更改框架协议为MIT,让你更自由地飞基于ThinkPHP 5.1重构&#xff0c;但核心代码兼容5.0版本&#xff0c;保证老用户最小升级成本…

MarkDown语言

参考&#xff1a; 参考&#xff1a;https://typora.io/参考&#xff1a;https://caret.io/Markdown是一种轻量级标记语言&#xff0c;创始人为約翰格魯伯&#xff08;英语&#xff1a;John Gruber&#xff09;。 它允许人们“使用易读易写的纯文本格式编写文档&#xff0c;然后…

${fn:} 函数

调用这样一个头文件<% taglib prefix"fn" uri"http://java.sun.com/jsp/jstl/functions " %> 下面就可以直接调用以下的函数。 函数名 函数说明 使用举例 fn:contains 判断字符串是否包含另外一个字符串 <c:if test"${fn:contains(name, s…

linux7.2配置多路径软件,RHEL6使用系统自带多路径软件配置多路径,rhel6路径

RHEL6使用系统自带多路径软件配置多路径&#xff0c;rhel6路径1、多路径的主要功能多路径一般配合存储设备实现如下功能&#xff1a;故障的切换和恢复IO流量的负载均衡磁盘的虚拟化2、查看系统自带的多路径软件是否安装[rootcluster01 ~]# rpm -qa |grep device-mapperdevice-m…

小甲鱼python课后答案40讲_小甲鱼Python 第30讲课后习题看不懂

本帖最后由 keydnal_aaron 于 2018-1-18 14:17 编辑 这个测试的文本里面是英文字符串&#xff0c;如果环境不同&#xff0c;注意下文本内容的编码方式&#xff0c;我的编程环境是centos7python3.6.4 from os import walk,getcwd from os.path import join def search_file():查…

SM4密码算法(附源码)

SM4是我们自己国家的一个分组密码算法&#xff0c;是国家密码管理局于2012年发布的。网址戳→_→&#xff1a;http://www.cnnic.NET.cn/jscx/mixbz/sm4/具体的密码标准和算法官方有非常详尽的PDF文档以供查阅&#xff0c;戳→_→&#xff1a;http://218.241.108.63/wiki/images…

vim ctrlp_使用Ctrlp和Ctag使Vim更智能

vim ctrlpby _haochuan通过_haochuan 使用Ctrlp和Ctag使Vim更智能 (Make Your Vim Smarter Using Ctrlp and Ctags) I absolutely love Vim, and I use Vim for all my coding and writing from year to year. Although more are more people, especially for those are worki…

linux系统可以无显卡运行吗,Linux操作系统无显卡安装方式

显卡安装方法&#xff1a;操作步骤&#xff1a;1、SBC上装上显卡&#xff0c;并启动安装程序2、安装linux系统并选择相应的安装包(选择lilo启动加载程序)如果安装时以GRUB方式加载的&#xff0c;需要在Grub.conf中将有关图形的语句屏蔽掉。#splashimage(hd0,0)/grub/splash.xpm…

软件工程专业实习可以做什么_想要获得软件工程实习机会? 这里有一些想法可以帮助您...

软件工程专业实习可以做什么by Tatiana Doyle塔蒂亚娜道尔(Tatiana Doyle) 想要获得软件工程实习机会&#xff1f; 这里有一些想法可以帮助您。 (Looking to land a software engineering internship? Here are some thoughts to help you.) A note: this post is simply mea…

ubuntu 简单配置samba

关键字: ubuntu samba今天在家&#xff0c;闲着没事&#xff0c;就想学习一下samba 来实现windows xp 访问ubuntu 的文件夹&#xff08;家里有两台pc&#xff09;&#xff0c;google了很多文章&#xff0c;但是很多都没有用&#xff0c;不过鸟哥的文章有很清楚的介绍&#xff0…

python3.8文档_python 3.8的新功能

演示和工具 添加了一个基准脚本&#xff0c;用于计时访问变量的各种方式&#xff1a; Tools/scripts/var_access_benchmark.py . &#xff08;由Raymond Hettinger在 bpo-35884 &#xff09; 以下是自Python3.3以来性能改进的摘要&#xff1a; Python version 3.3 3.4 3.5 3.6 …

mysql数据库备份及还原

一、Mysql数据库备份指令格式&#xff1a; mysqldump -h主机名 -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql 注&#xff1a;直接cmd执行该指令即可&#xff0c;不需要先mysql -u root -p链接数据库 1、备份MySQL数据库的命令mysqldump -hhostname -uuserna…

linux隐藏apache信息,Apache防盗链和隐藏版本信息-linux-centos运维

有需要服务器方面的需求和咨询&#xff0c;可以联系博主 QQ 7271895一、防盗链二、隐藏版本信息实验要求&#xff1a;三台虚拟机分别是&#xff1a;linux和两台windows虚拟机&#xff0c;linux虚拟机为服务器&#xff0c;Windows7-1为客户端&#xff0c;Windows7-2为盗链端。实…

查看oracle当前的连接数

SQL> select count(*) from v$session #当前的连接数SQL> Select count(*) from v$session where statusACTIVE #并发连接数SQL> select value from v$parameter where name processes --数据库允许的最大连接数SQL> show parameter processes #最大连接 SQL> …

led显示屏控制卡接线图解_Led显示屏出现花屏是什么原因

Led显示屏已经成为现在人们推广的一种形式了&#xff0c;很多地方都是离不开led显示屏的使用的。由于Led显示屏的五彩绚烂&#xff0c;也更加吸引人们的眼球。不过在使用过程中&#xff0c;也会遇到Led显示屏花屏的情况。那么&#xff0c;Led显示屏出现花屏是什么原因呢?下面伟…

【javascript】获取 格式化时间

function getDate() {var myDate new Date();var month myDate.getMonth() 1;var day myDate.getDate();month (month.toString().length 1) ? ("0" month) : month;day (day.toString().length 1) ? ("0" day) : day;var result myDate.getF…

深度强化学习和强化学习_深度强化学习:从哪里开始

深度强化学习和强化学习by Jannes Klaas简尼斯克拉斯(Jannes Klaas) 深度强化学习&#xff1a;从哪里开始 (Deep reinforcement learning: where to start) Last year, DeepMind’s AlphaGo beat Go world champion Lee Sedol 4–1. More than 200 million people watched as …

制作一个大风车加载条

一、前言 不想使用普通的那种转圈的加载条&#xff0c;所以找了一个大风车的图片&#xff0c;想要用旋转的大风车来表示加载中。   一般都会想着将大风车图片设置成ImageView组件&#xff0c;然后给这个组件添加一个旋转动画就可以了&#xff0c;但是我突然想到我是想写加载条…

Android OkHttp完全解析 是时候来了解OkHttp了

Android OkHttp完全解析 是时候来了解OkHttp了 标签&#xff1a; AndroidOkHttp2015-08-24 15:36 316254人阅读 评论(306) 收藏 举报分类&#xff1a;【android 进阶之路】&#xff08;67&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载…

c盘users的用户名怎么改_做完这几个操作,我从C盘中清理了30G垃圾文件

信息技术土著&#xff0c;一个有营养的公众号有个存在学说&#xff0c;比说一个人的身体某部位&#xff0c;如果不痛&#xff0c;你很少感觉他是存在的&#xff0c;但是某一天&#xff0c;因为某种原因&#xff0c;它突然很痛了&#xff0c;然后你每时每刻都会感觉到它的存在了…