并发工具类

ConcurrentHashMap的原理与实现

ConcurrentHashMap是线程安全且高效的HashMap ,在并发编程中使用hashMap可能导致程序死循环,而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap的登场机会

  • HashMap在并发执行put操作时会引起死循环,是因为多线程会导致hashMap 链表形成环形结构,一旦形成环形数据结构,Entry的next节点永远不会为空,就会产生死循环获取entry
  • HashTable容器使用synchronized来保证线程安全,但是在线程竞争激烈的情况下HashTable的效率非常的低下,因为当一个线程访问HashTable的同步方法,其他线程会进入阻塞或者轮询状态
  • ConcurrentHashMap的锁分段技术可有效的提升并发访问率:首先吧数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段数据也能够被其他线程访问。

在这里插入图片描述让我们看一下segments数组的源代码,为了能够通过按位与的三列算法来定位segments数组的索引,必须保证sedments数组的长度是2的N次方,所有必须计算出一个大于或者等于concurrencyLevel的最小的2的N次方的值来作为segments数组的长度。假如concurrencyLevel等于14,15或者16,ssize都会等于16,即容器里的锁的个数也是16

Java中的13个原子操作类

要想原子地更新字段类需要两步,第一步,因为原子更新字段类都是抽象类,每次使用的使用都必须使用静态方法newUpdater()创建一个更新其,并且需要设置想要更新的类和属性,第二步,更新类的字段(属性)必须使用public volatile修饰符

等待多线程完成的CountDownLatch

CountDownLatch允许一个或者多个线程等待其他线程完成操作
CountDownLoadLatch的构造函数接受一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N,当我们调用CountDownLatch的构造函数接受一个int类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。当我们调用CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await方法会阻塞当前线程,直到N变成0,由于CountDownLatch方法可以用到任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里面的N个执行步骤,用在多线程成里,只需要把这个CountDownLatch的引用传递到线程里面就可以了,我们不可能让主线程一直等待,所以可以使用另外一个带指定时间的await(),这个方法等待特定时间后,就会不再阻塞当前线程,join()也有着类似的方法
一个线程调用countDown方法happens-before,另外一个线程调用await方法
在这里插入图片描述

同步屏障CyclicBarrier

他要做的事情是,让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行
在这里插入图片描述还提供了一个更高级的构造函数CyclicBarrier(int parties,Runnable barrier-Action)用于在线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景。
CountDownLatch的计数器只能使用一次,而cyclicBarrier的计数器可以使用reset()方法重置,所以CyclicBarrier能处理更为复杂的业务场景,例如计算发生错误,可以重置计数器,让线程重新执行一次。

控制并发线程数的Semaphore

信号量是用来控制同时访问特定资源的线程数量,他通过协调各个线程,以保证合理的使用公共资源
semaphore的用法也很简单,首先线程使用semaphore的acqure()方法获取去可证,也就是最大并发数,使用完之后调用release()方法归还许可证,还可以使用tryAquire()方法获取许可证
在这里插入图片描述

线程间交换数据

exchanger是一个用于线程协作的工具类,exchanger用于进行线程间数据交换,他提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,这两个线程通过exchange方法交换数据,如果第一个线程执行exchange()方法,他会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据库传递给对方,如果两个线程有一个没有执行exchange方法,则会一直等待,如果担心有特殊情况发生,避免一直等待,可以设置最大等待时长

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值