多线程高阶

JUC

1.ReentrantLock

a.lock要写在try之前
b.一定要在final里面进行unlock().

2.信号量(semaphore)

方法:acquire(尝试获取锁,如果可以正常获取到,则执行后面的业务逻辑,如果获取失败,则阻塞等待)  
			release(释放锁)

在这里插入图片描述

3.计数器(CountDownLauth)

计数起是用来保证一组线程同时完成某个操作之后,才能继续后面的任务.

在这里插入图片描述

CountDownLauth是如何实现的?
答:在CountDownLauth里面有一个计数器,每次调用countdown()方法的时候计数器的数量 -1,知道减到0之后,就可以执行await之后的代码

在这里插入图片描述
CountDownLauth缺点:
CountDownLauth计数器的使用是一次性的,当用完一次之后,就不能在使用了

4.循环屏障(循环栅栏)

CyclicBarrier
在这里插入图片描述

在这里插入图片描述
CyclicBarrier和CountDownLauth的区别?
答:CountDownLauth计数器只能使用一次, CyclicBarrier它的计数器可以重复使用

HashMap 底层实现结构、负载因子,哈希冲突的解决等线程问题

HashMap(非线程安全的容器)
JDK 1.7 死循环
JDK 1.8 数据覆盖

HashMap JDK 1.7死循环分析:

HashMap 负载因子 0.75 在大于这个因子的时候,进行扩容
尽量的避免哈希冲突所带来的性能开销问题

在这里插入图片描述
HashMap在JDK1.7是头插法,在JDK1.8是尾插法
HashMap线程安全方案:ConcurrentHashMap
JDK 1.7是将ConcurrentHashMap分成几个segment进行加锁

在这里插入图片描述
JDK 1.8 锁优化,读的时候不加锁,写的时候加锁,使用了大量的CAS.Voiltail

Hashtable 线程安全的容器
给put方法整体加锁,所以一般情况下不会使用它,性能较低

HashMap.ConcurrentHashMap.Hashtable的区别?
答:
1.HashMap 是非线程安全的容器,他在JDK 1.7 会造成死循环,JDK1.8会造成数据覆盖.Hashtable和ConcurrentHashMap都是线程安全.
2.Hashtable实现线程安全的手段比较简单,它是在put方法整体加了一把锁,使用synchronized 修饰,因此性能不高,所以使用频率较低;而ConcurrentHashMap是HashMap在多线程下的替代方案,它在JDK 1.7 的时候使用的Lock加分段锁的方案来实现线程安全问题的保障,而在JDK 1.8 的时候使用了大量的CAS Volatiel 来实现线程的,并且在JDK 1.8 的时候读取的时候不加锁(读取的数据可能不是最新的,因为读取和写入可以同时进行),只有在写的时候才加锁。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值