ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

并发关键字

2021-06-16 12:03:57  阅读:341  来源: 互联网

标签:latch 并发 CountDownLatch 关键字 线程 Semaphore CyclicBarrier await


summary

AQS:reentrantLock、Semaphore、CountDownLatch、CyclicBarrier

ArrayBlockingQueue、linkedBlockingQueue、PriorityBlockingQueue、ConcurrentLinkedQueue


Unsafe

Unsafe类对于并发编程来说是个很重要的类,如果稍微看过J.U.C里的源码,会发现到处充斥着这个类的方法调用。这个类的最大的特点在于,它提供了硬件级别的CAS原子操作

volatile

作用
  1. 保证修改内存立即可见
  2. 防止指令重排序
原理

使用volatile变量能够保证:

  • 每次读取前必须先从主内存刷新最新的值。
  • 每次写入后必须立即同步回主内存当中

reentrantLock

lock()

unlock()

公平锁、非公平锁

当某一线程获取锁后,将state值+1,并记录下当前持有锁的线程,再有线程来获取锁时,判断这个线程与持有锁的线程是否是同一个线程,如果是,将state值再+1,如果不是,阻塞线程。 当线程释放锁时,将state值-1,当state值减为0时,表示当前线程彻底释放了锁,然后将记录当前持有锁的线程的那个字段设置为null,并唤醒其他线程,使其重新竞争锁

参考链接-csdn-reentrantlock可重入原理

readwriteLock、stampedLock

StampedLock提供了乐观读锁,可取代ReadWriteLock以进一步提升并发性能;

StampedLock是不可重入锁

参考-廖雪峰的日志-stampedeLock

Semaphore:控制线程总数,像限流

  1. 初始化最多的线程数为3

    Semaphore semaphore = new Semaphore(3, false);

  2. 获取信号量,如何信号量还有剩余,就能继续往下走

    semaphore.acquire();

  3. 释放信号量,其他线程能继续获取

    semaphore.release();

使用场景

  1. 控制最多线程数的情况

CountDownLatch:主线程等latch减到0再执行

countDown, await

原理

final CountDownLatch latch = new CountDownLatch(2);
// 其他线程 调用这个方法后,会减1
latch.countDown();

// 线程2 要等latch减完再执行
latch.await();

使用场景:子线程并发执行,主线程需要等子线程都执行完再执行。有点像future

CyclicBarrier:所有线程都等其他的完成

await

假若有若干个线程都要进行写数据操作,并且只有所有线程都完成写数据操作之后,这些线程才能继续做后面的事情,此时就可以利用CyclicBarrier了

CyclicBarrier barrier = new CyclicBarrier(N);
cyclicBarrier.await();
// 等所有的都执行完,继续执行

标签:latch,并发,CountDownLatch,关键字,线程,Semaphore,CyclicBarrier,await
来源: https://blog.csdn.net/xidianhuihui/article/details/117953733

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有