其他分享
首页 > 其他分享> > 并发关键字

并发关键字

作者:互联网

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