• Java并发容器


    1、jdk提供的并发容器包括:

      1.1 ConcurrentHashMap:线程安全的Hashmap

      1.2 CopyOnWriteArrayList:线程安全的List,在读多写少的场合,远远好于Vector

      1.3 ConCurrentLinkedQueue:高效的并发队列,使用链表实现,可以看做一个线程安全的LinkedList,这是一个非阻塞队列。

      1.4 BlockingQueue这是一个接口,jdk内部通过链表、数组等方式实现了这个接口,表示阻塞队列,非常适用于做数据共享的通道。

      1.5 ConcurrentSkipListMap:跳表实现,这是一个Map,使用跳表进行快速查找。

    2、ConcurrentHashMap

    在ConcurrentHashMap中,无论是读操作还是写操作都能保证很高的性能;在进行读操作的时候不需要加锁,而在写操作时通过锁分段技术对所操作的端加锁不影响客户端对其他段的访问。

    1、jdk1.7将哈希桶切分成最小数组Segment,笑一个小数组有n个HashEntry组成。每一个线程占用锁访问其中一段数据,其他段数据也能被其他线程访问,实现并发。

    Segment继承了ReentrantLock,所以Segment也是一种可冲入锁,segment默认是16,并发度也是16

    2、JDK1.8:选择了Hashmap相同的数据结构,Node数组+链表+红黑树结构;在锁的实现上抛弃了原来的Segment分段锁,采用的是CAS+Synchronized实现的更加细粒度的锁(如果没有hash冲突采用cas直接插入,如果有hash冲突,就将数组中的元素级别上加一把synchronized锁)

    将锁的级别控制在了更细粒度的哈系统数组元素级别,也就是说只需要锁住链表的头结点,或者红黑树的根节点,就不会影响其他的哈希桶数组的读写,大大提高了并发度。

    3、JDK1.8使用内置锁Synchronized替换了ReentrantLock锁

    3.1:synchronized锁在jdk1.6开始就引入了大量的优化,并且synchronized有多重锁,会从无锁->偏向锁->轻量锁->重量级锁一步一步的转换

    3.2:减少内存开销。假设使用可重入锁获得同步的支持,那么每个节点都需要继承AQS来获取同步支持。但并不是每个节点都需要同步支持,只有链表的头结点或者红黑树的根节点需要同步。

    4、concurrenthashmap和hashtable效率哪个更高?为什么?

    4.1 concurrenthashmap更高,因为hashtable会给整个哈希表加一大把锁。而concurrenthashmap的锁粒度更低,CAS+synchronized。cas保证可见性、synchronized锁头结点。

  • 相关阅读:
    浏览器打开developers.weixin.qq.com开头的网站加载特别慢或者无法打开
    微信小程序在微信开发者工具中打开时为何提示“小程序重启耗时过久,请确认业务逻辑中是否有复杂运算,或者死循环”?
    解决VMware Workstation 15 与Device/Credential Guard不兼容的问题
    Gitee同步项目后内容一致MD5不同
    Python2.7安装easy_install和pip
    php连接数据库
    css画三角形
    css的9个常用选择器
    Javafx弹窗
    javafx将数据库内容输出到tableview表格
  • 原文地址:https://www.cnblogs.com/Alei777/p/16241632.html
Copyright © 2020-2023  润新知