同步容器和并发容器的区别

同步容器:可以简单地理解为通过synchronized来实现同步的容器,如果有多个线程调用同步容器的方法,它们将会串行执行。比如Vector,Hashtable,以及Collections.synchronizedSet,synchronizedList等方法返回的容器。这些类实现线程安全的方式是:将他们的状态封装起来,并对每个公有的方法都进行同步,使得每次只有一个线程能访问容器的状态。

同步容器都是线程安全的,但是在某些情况下我们可能需要额外的客户端加锁来保护复合操作。容器上常见的符合操作包括:迭代,跳转,以及条件运算。在同步容器类的内部,这些复合操作时线程安全的,但是当其他线程并发的修改容器时,他们可能会有意外的行为。

public static Object getLast(Vector list) {  int lastIndex = list.size() - 1;  return list.get(lastIndex);  
}  <span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.2px;">     </span><pre name="code" class="java">public static void deleteLast(Vector list) {  int lastIndex = list.size() - 1;  list.remove(lastIndex);  
}  

 
 虽然上面的方法看起来没有问题,Vector自身的方法也是同步的,但是在多线程环境中还是隐藏着问题。如果有两个线程A,B同时调用上面的两个方法,假设list的大小为10,这里计算得到的lastIndex为9,线程B首先执行了删除操作(多线程之间操作执行的不确定性导致),而后线程A调用了list.get方法,这时就会发生数组越界异常。导致问题的原因就是上面的复合操作不是原子操作,这里可以通过在方法内部使用list对象锁来实现原子操作。 

解决的方法一:使用客户端加锁的机制,通过过得容器类的锁,我们可以使得如下的两个方法称为原子类操作。但是该方法会降低并发性,牺牲了伸缩性。

<pre name="code" class="java">public static Object getLast(Vector list) {  
synchronized(list)   {int lastIndex = list.size() - 1;  return list.get(lastIndex);  }
}       
public static void deleteLast(Vector list) {  
synchronized(list){   int lastIndex = list.size() - 1;  list.remove(lastIndex);  }
}  

 

同步容器将所有对容器的访问都串行化,以实现他们的线程安全性,这种方法的代价是严重降低并发性,当多个线程竞争访问容器的锁时,吞吐量将会严重减低。

并发容器:针对多个线程设计的,用并发容器来代替同步容器,可以极大地提高伸缩性并降低风险。 如ConcurrentHashMap,CopyOnWriteArrayList等。并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性,例如在ConcurrentHashMap中采用了一种粒度更细的加锁机制,可以称为分段锁,在这种锁机制下,允许任意数量的读线程并发地访问map,并且执行读操作的线程和写操作的线程也可以并发的访问map,同时允许一定数量的写操作线程并发地修改map,所以它可以在并发环境下实现更高的吞吐量。




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

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

相关文章

当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?

总的思路&#xff1a;在浏览器地址栏键入URL&#xff0c;按下回车之后发生的几个事件&#xff1a; 1&#xff09;浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址&#xff1b; 2&#xff09;解析出IP地址后&#xff0c;根据该IP地址和默认端口80&#xff0c;和服务器建立…

上海音乐学院计算机考研难吗,上海音乐学院考研难吗?一般要什么水平才可以进入?...

问&#xff1a;从上海音乐学院毕业的学生就业怎么样&#xff1f;值不值得报考&#xff1f;答&#xff1a;想要了解更多毕业生就业情况见>>>就业报告汇集总之&#xff0c;上海音乐学院就业率相对来说是比较良好的&#xff0c;如果大家对此学校感兴趣的话&#xff0c;可…

Java-消息框显示两整数加减乘除

//两个整数加减乘除 //Qi Ming Liu,October 7,2015 import javax.swing.JOptionPane; public class Calculater { public static void main(String args[]) { //用户输入的两个数。 String firstNumber,secondNumber; //两个加数&#xff0c;以及和、差、积、商。 int numb…

DTO – 服务实现中的核心数据

最近实习&#xff0c;初接触项目&#xff0c;对好多的东西不是很清楚&#xff0c;看了下面的这篇博客对一个Web服务的实现中使用DTO及MO有了比较清楚的了解&#xff01;&#xff01;&#xff01; http://www.cnblogs.com/loveis715/p/4379656.html 在三层模型中&#xff0c;ser…

Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

概要 学完了Map的全部内容&#xff0c;我们再回头开开Map的框架图。 本章内容包括&#xff1a;第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转载请注明出处&#xff1a;http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid…

计算机在社区健康档案管理中的作用,某社区卫生中心对辖区居民的健康档案信息进行电子化。一直建档居民的年龄范围在1..._考试资料网...

某社区卫生中心对辖区居民的健康档案信息进行电子化。一直建档居民的年龄范围在18岁以上&#xff0c;但某一份健康档案中的年龄却出现了15岁;某一份健康档案中所记录的心律为1000次/分&#xff0c;某一份健康档案中记录的性别伟男性&#xff0c;但在疾病中记录有子宫肌瘤。1.信…

Select count(*)和Count(1)的区别和执行效率比较

在MySQL中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。经常会看到一些所谓的优化建议不使用Count(* )而是使用Count&#xff08;1&#xff09;&#xff0c;从而可以提升性能&#xff0c;给出的理由是Count( *)会带来全表…

html5语异性元素,异性的5句性暗示

茫茫人海&#xff0c;我们或者擦身而过&#xff0c;或者在不经意间相遇&#xff0c;相识&#xff0c;相知。在某些特定的时刻&#xff0c;一句话就足以决定一段缘分。1.今晚我一个人住。这是一句百分百的性暗示语言。今晚&#xff0c;显然是约定时间。一个人住&#xff0c;表明…

支付相关备忘

2015年10月9日 11:02:12 支付宝/微钱包等等可能在成功/失败回调多次 因此每一次处理的时候都要验证订单是否已经处理过了 如果订单是已经成功状态就丢弃回调, 如果订单是失败状态,或未成功状态就继续接受回调转载于:https://www.cnblogs.com/iLoveMyD/p/4863354.html

Spring@Autowired注解

import org.springframework.beans.factory.annotation.Autowired; public class Boss { Autowired private Car car; Autowired private Office office; … } 原来一直以为一个Autowired 注释就可以对所有的类成员变量、方法及构造函数进行自…

计算机重装系统后黑屏,电脑重装系统后开机黑屏怎么办

‍最近有用户反映自己在重装电脑系统后&#xff0c;开机出现了黑屏的现象&#xff0c;检查后发现硬件设备没有故障&#xff0c;那么是怎么回事呢&#xff1f;小编分析得出&#xff0c;这个问题应出在显卡上&#xff0c;有可能是显示器不支持该显卡显示的分辨率或者是重装系统后…

北大“四大疯人院”之说

本文转自自己看到的一个一篇文章&#xff0c;突然明白原来名校的学生真的并不是与生俱来比别人很厉害&#xff0c;而是一点一滴的积累&#xff0c;一点一滴的拼搏&#xff0c;持之以恒终成一极&#xff01;&#xff01;&#xff01;那时候我开始慢慢明白&#xff0c;在这个世界…

计算机图像变为红色是什么故障,电脑显示器变成红色怎么办

在有些时候我们的电脑显示器变成红色了&#xff0c;这该怎么办呢?下面就由学习啦小编来为你们简单的介绍电脑显示器变成红色的原因及解决方法吧!希望你们喜欢!电脑显示器变成红色的原因及解决方法&#xff1a;(1)显卡接触不良故障&#xff1a;显卡接触不良通常会引起无法开机且…

iOS开发中@property的属性weak nonatomic strong readonly等介绍

property与synthesize是成对出现的&#xff0c;可以自动生成某个类成员变量的存取方法。在Xcode4.5以及以后的版本&#xff0c;synthesize可以省略。 1.atomic与nonatomicatomic&#xff1a;默认是有该属性的&#xff0c;这个属性是为了保证程序在多线程情况&#xff0c;编译器…

山师2019计算机真题,2019山师附中推荐生面谈真题(山东师范大学附属中学)

山师附中2019年推荐生考试于5月25日、26日进行&#xff0c;第一天上午笔试&#xff0c;第二天上午面试。面试包括三项内容&#xff1a;(1) 科学素质、实践能力及发展潜能测试。(2) 综合面试。(3) 心理素质测试(合格性测试&#xff0c;不计入总分)。面试包括三项内容&#xff1a…

CMD窗口的cd命令

cd /? 显示帮助信息 cd \ 返回到当前所在的根目录中去 cd .. 返回到上一级的目录中去 cd 目录名 可以进入下一层目录 d: 改变当前驱动器的目录