java中线程安全的容器_jfinal容器线程安全吗

java中线程安全的容器_jfinal容器线程安全吗四、线程安全的容器类Java编码中,我们经常需要用到容器来编程。在并发环境下,Java提供一些已有容器能够支持并发。1.Map在Map类中,提供两种线程安全容器。java.util.HashtableHashtable和HashMap类似,都是散列表,存储键值对映射。主要区别在于Hashtable是线程安全的。当我们查看Hashtable源码的时候,可以看到Hashtable的方法都是通过syn

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

四、线程安全的容器类

Java编码中,我们经常需要用到容器来编程。在并发环境下,Java提供一些已有容器能够支持并发。

1.Map

CollectionMap

在Map类中,提供两种线程安全容器。

  • java.util.Hashtable

Hashtable和HashMap类似,都是散列表,存储键值对映射。主要区别在于Hashtable是线程安全的。当我们查看Hashtable源码的时候,可以看到Hashtable的方法都是通过synchronized来进行方法层次的同步,以达到线程安全的作用。

  • java.util.concurrent.ConcurrentHashMap

ConcurrentHashMap是性能更好的散列表。在兼顾线程安全的同时,相对于Hashtable,在效率上有很大的提高。我们可以猜想,Hashtable的线程安全实现是对方法进行synchronized,很明显可以通过其他并发方式,如ReentrantLock进行优化。而ConcurrentHashMap正是采用了ReentrantLock。运用锁分离技术,即在代码块上加锁,而不是方法上加。同时ConcurrentHashMap的一个特色是允许多个修改并发操作。这就有意思了,我们知道一般写都是互斥的,为什么这个还能多个同时写呢?那是因为ConcurrentHashMap采用了内部使用段机制,将ConcurrentHashMap分成了很多小段。只要不在一个小段上写就可以并发写。

2. Collection

Collection

Collection部分主要是运用的CopyOnWrite机制,即写时复制机制。从字面上就能理解什么意思,就是当我们往一个容器里添加元素的时候,先对这个容器进行一次复制,对副本进行写操作。写操作结束后,将原容器的引用指向新副本容器,就完成了写的刷新。

从它的实现原理,我们可以看出这种机制是存在缺点的。

1.内存占用:毫无疑问,每次写时需要首先复制一遍原容器,假如复制了很多,或者本身原容器就比较大,那么肯定会占用很多内存。可以采用压缩容器中的元素来防止内存消耗过大。

2.数据一致性问题:当我们在副本中进行写操组时,只能在最终结束后使数据同步,不能实时同步

可以看到,这种机制适用于读操作多,写操作少的应用场景。

  • java.util.concurrent.CopyOnWriteArrayList

    Collection类的线程安全容器主要都是利用的ReentrantLock实现的线程安全,CopyOnWriteArrayList也不例外。在并发写的时候,需要获取lock。读的时候不需要进行lock

  • java.util.concurrent.CopyOnWriteArraySet

    CopyOnWriteArraySet的实现就是基于CopyOnWriteArrayList实现的,采用的装饰器进行实现。二者的区别和List和Set的区别一样。

  • Vector

    一般我们都不用Vector了,不过它确实也是线程安全的。相对于其他容器,能够提供随机访问功能。

3.StringBuffer和StringBuilder

我们知道,String在进行+操作的时候,原生的String会重新新建一个String对象来完成字符串拼接,明显这种操作多了的话会加重服务器负担。因此我们需要的时候就会用StringBuffer和StringBuilder。这二者有什么区别呢?

StringBuffer是线程安全的,StringBuilder不是。从StringBuffer的源码可以看到,它采用的是对方法进行synchronized实现的同步。但是加了同步机制,肯定会对性能有一定影响。

高并发情况下,对数据安全有需求,则用StringBuffer,否则用StringBuilder

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194519.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unable to AUTH to MASTER: -ERR Client sent AUTH, but no password is set「建议收藏」

    Unable to AUTH to MASTER: -ERR Client sent AUTH, but no password is set「建议收藏」问题描述:redis主从复制时,想要增加密码认证功能。初学了解不多,修改了master的redis_6379.conf,增加”masterauth 123456″,同时修改slave的redis_6380.conf,增加”masterauth 123456″。认为主从配置的认证密码的参数都是masterauth。重新启动后用redis-cli连接slave,输入info replicati…

    2022年6月13日
    60
  • kinect深度距离误差_TOF相机深度矫正基于Kinect v2

    kinect深度距离误差_TOF相机深度矫正基于Kinect v2之前的文章《answer:深度相机(TOF)矫正》由于时间匆忙,临时想了一种深度相机深度像素矫正方法,即固定高度逐像素矫正。该方法简单粗暴,效果并不理想,最近查阅了相关文献资料,基于之前的思路整理出一种现场可用的简单易行的矫正方法。二维平面畸变矫正使用张氏标定法对二维平面进行径向畸变矫正。深度像素矫正做图像处理的难点在于图像包括图像的噪声随机性很大,即使在同一位置拍摄也没有完全一样的图像,所以所设…

    2022年5月25日
    35
  • mysql5.7卸载不干净_mysql卸载残留

    mysql5.7卸载不干净_mysql卸载残留一、在控制面板中卸载mysql软件,此时mysql没有卸载干净。二、卸载过后删除C:ProgramFiles(x86)MySQL该目录下剩余了所有文件,把mysql文件夹也删了三、windows+R运行“regedit”文件,打开注册表四、删除注册表:HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesEventlogApplicationMySQL文件夹…

    2022年9月28日
    3
  • Mac命令行退出vim

    Mac命令行退出vim@Mac命令行退出vimMac退出vim按下ESC后输入:才能进入命令模式!进入之后输入:qw(保存退出)然后按2次大写Z退出q!(不保存退出)输入后回车退出新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计,将会带来全新的写作体验;在创作中心设置你喜爱的代码高…

    2022年6月11日
    604
  • native2ascii 用法_hex转ascii 在线

    native2ascii 用法_hex转ascii 在线native2ascii插件org.codehaus.mojonative2ascii-maven-plugin1.0-beta-1UTF-8src/main/resources/${message.dir.rel}${outputDirectory}/${message.dir.rel}**/*.propertiesnative2asc

    2022年9月11日
    1
  • 【豆瓣达人总结】做爱做的事,看有趣的人

    【豆瓣达人总结】做爱做的事,看有趣的人惊雀http://www.douban.com/people/4917689/有想法很特别的一位大哥,从另一个角度告诉你什么叫做“人不可貌相”,有位友邻说得好:之所以觉得惊先生特别是因为先生是为数不多思考爱情的帅哥~@东窗未白keledollhttp://www.douban.com/people/keledoll/热血科学心理学女青年,今天才发现她有豆瓣页面。搜索kele

    2022年9月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号