多线程5 站在巨人的肩膀上

同步容器类

同步容器类是通过对自身状态的封装,并对每个public方法进行加锁同步。通过Collections.synchronizedXxx()等创建的容器就是同步容器类,常用的有:vector、hashtable。
那么同步同步容易类是线程安全的吗?会出现问题吗?
答案:是线程安全而且有可能出现很严重的问题!

容器上的常见符合操作若没有在客户端的代码上加锁来保护就有可能出现错误。例如:迭代、条件运算、跳转(根据指定顺序找到当前元素的下一个元素)

例举几种可能出现的情况和解决办法

1、同步容器类Vector上有两个方法getLast和deleteLast,都会有“如果没有就添加”的操作。如果线程A上调用getLast线程B上调用deleteLast,这些操作交替执行,如下图中请求一个不存在的元素,就会出错。这时候就要在客户端加锁,但会牺牲一些伸缩性和并发性。
A→ size(10) ——————→get(9)→错误
B→ size(10)→remove(9)
2、迭代的标准方式都是使用Iterrator。如果容器没有加锁,对容器进行迭代的时候,其他线程并发的修改了这个容器,就会出现一种及时失败的问题,抛出异常(ConcurrentModificationException)。他并不是一种完善的处理机制,所以只能用做预警指示器。想要避免就必须在迭代的过程持有容器的锁,如果是个共享容器就需要在所有迭代的地方加锁。也可以通过克隆容器并在副本上迭代解决(克隆的过程仍需加锁),但是有显著的性能开销取决因素可能有容器大小、元素执行的负责度、调用其他容器的频率、响应时间和吞吐量等
3、隐藏迭代 system.out.pringln(“字符串A”+容器A),编译器将字符转换为StringBuilder.append又会调用容器的toString,标准容器中的toString将进行迭代,这时候就有可能例2的情况。hashCode, equals, containsAll, removeAll, retainAll, 以其他容器为参数的构造器也会进行隐性迭代

第五章 站在巨人的肩膀上相关推荐

  1. 站在巨人的肩膀上“思考”问题,重在思考而不是拿来主义

    米老师按:觉得值得讨论的小文!我还要认真地想一想 主题:围绕职责链设计模式-计算收费有效时间博客展开讨论 参与人: 讨论时间: 讨论内容 这次讨论主要分为以下几点: 一.职责链模式应用于机房收费系统计 ...

  2. 【Visual C++】游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

    看到在留言中很多朋友提到不太清楚DirectX与游戏引擎的区别的问题,在这里浅墨就专门把自己对游戏引擎的一些理解写成一篇文章,作为我们<Visual C++游戏开发>专栏的游戏引擎导论,也 ...

  3. 游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8250057 作者:毛星云(浅墨 ...

  4. 知识就是力量,让机器站在巨人的肩膀上

    作者:微软亚洲研究院 闫峻博士 知识是什么?抽象来说,是人类对世界的认知,对宏观及微观世界客观规律的总结.具体来说,大到牛顿定律.量子力学中的科学发现,小到自家孩子的生日.太太做饭常用的酱油颜色,都是 ...

  5. 3小时快速入门数学建模竞赛-建模技巧2:追根溯源,站在巨人的肩膀上

    我们要检索哪些信息?和怎样获得快速.准确的信息?这两个问题. 首先回答第一个问题,我们需要检索哪些信息?我们从我们需要求解的内容入手,请看思维导图和系统框图,我们需要求解35年寿命期内的发电总量.经济 ...

  6. 站在巨人的肩膀上看Servlet——原来如此(更适合初学者认识Servlet)

    前言: 有段时间没更新博客了,这段时间因为要准备考试,考完试后又忙了一阵别的事,一直没能静下心来写博客.大学考试真是越来越恶心了,各种心酸,那酸爽,够味.不过还好,马上就要大三了,听大三学长学姐说大三 ...

  7. “站在巨人的肩膀上”

    站在巨人的肩膀上需要拥有巨人的实力 容易错误理解成:"盗取"巨人的成果并漠视了巨人

  8. 站在巨人的肩膀上看世界,MySQL初步使用语法

    站在巨人的肩膀上看世界,MySQL初步使用  MySQL是一个常用的数据库,对于他的使用,我们需要尽量的了解它,但是掌握初步的语法,也可以勉强使用它,这都归功于它的研发者们.正是因为这些大佬,写好了软 ...

  9. 站在巨人的肩膀上:C#编写WindowsService

    本文将为大家详细介绍如何用C#编写一个系统服务,当然肯定不是教大家从头写,而是在一个搭建好的框架上进行自我创作! 一.项目整体架构 本项目的开发是针对某设备的开启异常情况进行邮件提醒,针对监控到的未开 ...

  10. 双引擎架构 Vite 是如何站在巨人的肩膀上实现的?

    在前面的章节中,我们学习了很多 Vite 使用和项目搭建的内容.接下来让我们将目光集中到 Vite 本身的架构上,一起聊聊它是如何站在巨人的肩膀上实现出来的.所谓的巨人,指的就是 Vite 底层所深度 ...

最新文章

  1. deeplearning 重要调参参数分析
  2. vsftp建立虚拟用户不同目录分配不同权限操作步骤详解
  3. 实战react技术栈+express前后端博客项目(8)-- 前端管理界面标签管理+后端对应接口开发...
  4. Git使用教程:最详细、最浅显
  5. 还在4S店买车?《Boss1+1》张朝阳对话贾鸣镝“种草”购车新方式
  6. python ansible模块_Python之——Ansible常用模块及API,pythonansibleapi
  7. 吴征:只为寻找到杨澜
  8. 一个关于指针+记录数据类型的使用技巧
  9. paip. 解决php 以及 python 连接access无效的参数量。参数不足,期待是 1”的错误
  10. Java项目 yaml明文密码加密
  11. 第六届中国多式联运合作与发展大会暨多式联运示范成果展在京举办
  12. weka分类器怎么设置样本类别_NeurIPS 2020 | 港中文MMLab自步对比学习: 充分挖掘无监督学习样本...
  13. 阿里云虚拟空间No input file specified
  14. 拆字在线版-扌斥字在纟戋片反
  15. Mac 终端——常用命令语
  16. uci数据集中的缺失数据_从uci早期糖尿病风险预测数据集中创建分类器
  17. Browser 浏览器内核
  18. 2022年全国职业院校技能大赛网络安全赛卷(中职组)卷3
  19. 盘点全球最热门十家大数据公司中国占据三席
  20. c#和python更适合爬虫_Python2和Python3哪个更适合初学者学习来爬虫

热门文章

  1. linux 中xls格式的文件,如何在命令行中将XLS文件转换为CSV [Linux] | MOS86
  2. AI 编辑视频!这特效太逆天了!代码开源 SIGGRAPH Asia 2021
  3. 【开源代码】-基于国民N32G45x系列MCU使用JLINK的RTT Viewer/logger/Client组件工具
  4. Web前端-HTML
  5. 3.EVE-NG导入Dynamips和IOL
  6. Simulink代码生成:通过Legacy Code Tool集成C函数
  7. 无法解决Duron1G在Ubuntu下降温监控
  8. HTML引用高德英文地图
  9. 汉字转语音 android 软件,文字转语音助手
  10. win7网上邻居无计算机一栏,Win7在网上邻居上看不到别的电脑怎么办?-电脑自学网...