ConcurrentHashMap 同步安全 的真正含义(stringbuff 是同步安全的,stringbutter 不安全)
同步安全的集合,在多线程下用到这个map是安全的,但这个安全指的是什么?线程安全指的是指get、remove、put等操作时即同一对象,同一时间只有一个线程能在这几个方法上运行,也就是说线程安全是在这集合的三个操作基础上是线程安全的,但由于集合往往都和迭代器组合起来用,比如集合的遍历,一般都是和itator组合用,即itator是一个对象,这个对象里有当前索引位置(初始索引为0即集合第一个下标)和上一个索引位置(初始为-1,即集合第一个下标的前一个下标,第一个下标为0,那前一个下标 当然是-1)和理想迭代的数量(这个属性不知道干什么用的)以及集合的引用,就是说这个itato对象有四个属性,其中前2个属性用来迭代用的,第三个属性不知道干啥用的,第四个属性就是原来集合的一个镜像,最终迭代完就是通过这第四个镜像来同步原来的集合用的,线程安全安全就是体现在这里,假如一个集合是不安全的,那这个集合在遍历时假如itator中第四个属性即原集合的镜像在一个线程里是删除(目前只测试了删除会报错,get方法忘记测试了)操作,在另外一个线程里是加入一个元素,结果2个线程同步原集合时就会出现少加或者多加等莫名其妙的问题(在map遍历时能否进行元素的删除,修改可以,但删除有的map可以有的则不行,不行的map删除必报错:java.util.ConcurrentModificationException ,比如hashMap、list 等 集合是不安全 集合,遍历时是不能删除的,而 ConcurrentHashMap 是多线程安全的map集合,遍历时就可以删除。至于为啥不能删除上边说了原因,就是因为hashmap、list等遍历时是通过itator 遍历的,而其遍历时是元素是不可逆的,而且枷锁的,当正遍历时如有其中一个删除,第四个属性镜像同步外部的list 或者 hashmap 时 由于找不到 list或者hashmap中的对应元素就会报错。),而有个map是线程安全的,就不用担心这个问题,至于怎么个不用担心,原因是遍历时不用迭代器还是通过其他方式保证安全我不知道,反正就不用关心出错就行。还有就是 不管这个map是不是线程安全的,假如map就是线程安全的,多线程下还是要加这个同步锁,因为map自身的线程安全不是指这一方面的安全(上边讲了线程安全的意义),假如这个集合在多线程下有改动,还是需要synchronize 锁住的,不然多线程下,集合中的一个对象在这个线程中修改成那个值,在这个线程下修改为这个值,2个线程下这个对象值不一致,不可控,结果肯定也是数据错乱问题,所以在业务中仍然还应该要加锁 。 那不安全的集合啥时候用呢,一个是单线程下可以用,但仍不可以遍历时删除,还一个就是 比如基础模板封装的集合,这个集合只会 get不会删除,这种情况可以选择非同步安全的集合。所以不管单线程还是多线程,几乎最好都用线程安全的集合(集合只用来get 不会删除的除外可以用非安全的集合,如游戏基础数据存放的集合)。
补:集合线程安全不安全除了上边说的遍历时删除会报错,即出现不安全的问题,还有就是多线程间调用同一个集合,修改集合中的同一个对象属性时,如果是多线程同时修改的话,第四个属性同步时也会出现不安全的报错问题。
ConcurrentHashMap 同步安全 的真正含义(stringbuff 是同步安全的,stringbutter 不安全)的更多相关文章
- 数据库同步工具HKROnline SyncNavigator SQL Server互同步MySQL
需要联系我QQ:786211180 HKROnline SyncNavigator 是一款专业的 SQL Server, MySQL 数据库同步软件.它为您提供一种简单智能的方式完成复杂的数据库数据同 ...
- centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课
centos shell编程4[分发系统] 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要 ...
- 【同步工具类】CountDownLatch闭锁任务同步
[同步工具类]CountDownLatch闭锁任务同步 转载:https://www.cnblogs.com/yangchongxing/p/9214284.html 打过dota的同学都知道,多人一 ...
- 搭建NTP时间服务器~使用NTP同步时间~构建主机间时间自动同步关系
NTP是一个时间服务器,同时它也是一个时间客户端. 我们可以使用它构建主机与主机之间的时间自动同步环境,保证所有服务器时间一致性. 常用的公共NTP时间服务器有: cn.ntp.org.cn 中国 n ...
- Delphi:与VCL同步(Synchronize()、用消息来同步)
看本文时,可以同时参考:Delphi中线程类 TThread实现多线程编程(事件.临界区.Synchronize.WaitFor……) 先说一下RTL和VCL RTL(Run-Time library ...
- 定时自动同步文件,支持多文件夹同步,支持过滤文件和文件夹,解决FileSystemWatcher多次文件触发事件(源码)
博客园里面有很多同步工具和软件,关于FileSystemWatcher类解释的也很多,但收集了很多文章后,感觉没好的方法,自己没事写了一个定时文件同步,借鉴了很多博客园朋友的东西: 上主菜: 配置文件 ...
- centos 7.2 同步北京时间 ,多台机器同步时间
linux 系统没有北京时间,同步的是上海时间 linux 系统有两个时钟:一个是硬件时钟,即BIOS时间:另一个是系统时钟,是linux系统Kernel(内核)时间. 系统开启时,系统会读取硬件时间 ...
- mysql数据库主从同步读写分离(一)主从同步
1.mysql数据库主从同步读写分离 1.1.主要解决的生产问题 1.2.原理 a.为什么需要读写分离? 一台服务器满足不了访问需要.数据的访问基本都是2-8原则. b.怎么做? 不往从服务器去写了 ...
- rsync 实现文件同步 (重要数据通过rsyncr把数据同步到不同的两台服务器上,这样可以防止服务器的硬盘故障导致数据丢失) 客户端同步时如果要排某个目录
rsync是unix系统下的数据镜像 备份工具,一般linux系统都 自带: # rpm -qa|grep rsync rsync-3.0.9-17.el7.x86_64 服务器端:10.100.0. ...
随机推荐
- 工作了这么长时间,是不是非用macbook pro不可呢?
连续奋战了二十多天,肉眼可见自己的状态一天不如一天.总觉得自己是不是该放下一切好好休息两天,但是理智又告诉我不能停.不能停. 既然不能停,那就把之前攒下的文章写一写吧. 什么是macbook pro ...
- hdu2087kmp模板练习
题目网址:http://icpc.njust.edu.cn/Problem/Hdu/2087/ 代码: #include<bits/stdc++.h> using namespace st ...
- ubuntu在github上传项目
GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub. 作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户.随着越来 ...
- 单调栈-Maximum Width Ramp
2020-01-23 19:39:26 问题描述: 问题求解: public int maxWidthRamp(int[] A) { Stack<Integer> stack = new ...
- 动态规划/MinMax-Predict the Winner
2018-04-22 19:19:47 问题描述: Given an array of scores that are non-negative integers. Player 1 picks on ...
- java 实现全排列
public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = n ...
- mysql系列--sql实现原理
count(*) MyISAM 引擎把⼀个表的总⾏数存在了磁盘上,因此执⾏ count(*) 的时候会直接返回这个数,效率很⾼:但是加了条件则不能快速返回⽽ InnoDB 引擎就麻烦了,它执⾏ cou ...
- Git 处理换行符的配置方法
core.autocrlf If you're programming on Windows and working with people who are not (or vice-versa), ...
- VBScript 打开含有"空格"的路径 (Open Path with Space)
记录,VBScript 如何打开,含有"空格"的路径.这个问题和常见,却总是忘! 直接上代码了,多说无益. Option Explicit Dim obj Dim path Set ...
- SpringCloud微服务架构和SOA架构
1,传统的三层架构 在传统的架构中,SSH,SSM,主要分为web 控制层,业务逻辑层,数据库访问层,单点项目,项目没有拆分,所有的开发任务全部写在一个项目中,耦合度比价高,如果程序中的一个功能出现了 ...