并发关键字
作者:互联网
summary
AQS:reentrantLock、Semaphore、CountDownLatch、CyclicBarrier
ArrayBlockingQueue、linkedBlockingQueue、PriorityBlockingQueue、ConcurrentLinkedQueue
Unsafe
Unsafe类对于并发编程来说是个很重要的类,如果稍微看过J.U.C里的源码,会发现到处充斥着这个类的方法调用。这个类的最大的特点在于,它提供了硬件级别的CAS原子操作
volatile
作用
- 保证修改内存立即可见
- 防止指令重排序
原理
使用volatile变量能够保证:
- 每次
读取前
必须先从主内存刷新最新的值。 - 每次
写入后
必须立即同步回主内存当中
reentrantLock
lock()
unlock()
公平锁、非公平锁
当某一线程获取锁后,将state值+1,并记录下当前持有锁的线程,再有线程来获取锁时,判断这个线程与持有锁的线程是否是同一个线程,如果是,将state值再+1,如果不是,阻塞线程。 当线程释放锁时,将state值-1,当state值减为0时,表示当前线程彻底释放了锁,然后将记录当前持有锁的线程的那个字段设置为null,并唤醒其他线程,使其重新竞争锁
readwriteLock、stampedLock
StampedLock
提供了乐观读锁,可取代ReadWriteLock
以进一步提升并发性能;
StampedLock
是不可重入锁
Semaphore:控制线程总数,像限流
-
初始化最多的线程数为3
Semaphore semaphore = new Semaphore(3, false);
-
获取信号量,如何信号量还有剩余,就能继续往下走
semaphore.acquire();
-
释放信号量,其他线程能继续获取
semaphore.release();
使用场景
- 控制最多线程数的情况
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