首页 > 其他 > 详细

JDK并发包

时间:2020-03-19 16:13:01      阅读:40      评论:0      收藏:0      [点我收藏+]

一. java.util.concurrent.locks.ReentrantLock重入锁

1.手动加锁,手动释放锁,对逻辑控制的灵活性要高于synchronized

lock.lock();
try{
  i++;
}finally{
  lock.unlock();
}

2.在等待锁的过程中,取消对锁的请求

lockInterruptibly()方法对锁进行请求时可以相应interrupt()方法来中断线程;

3.设定等待时间

tryLock()成功获得锁返回true,否则返回false,不等待,立即返回;

tryLock(long time, TimeUnit unit)在给定时间内尝试获得锁;

4.实现公平锁

public RenentrantLock(boolean fair)

维护有序队列,按照时间先后顺序获得锁,实现成本比较高,性能低下;

5.Condition

await()使当前线程等待,同时释放当前锁,可以被中断;

awaitUninterruptibly()不会在等待过程中被中断;

singal()用于唤醒一个在等待中的线程;

singalAll()用于唤醒所有在等待中的线程;

二. Semaphore信号量

public Semaphore(int permits)
public Semaphone(int permits, boolean fair) //指定是否公平

1. acquire() 尝试获得一个准入许可,若无法获得会进入等待,直到有线程释放或被中断;

2. acquireUninterruptibly() 尝试获得一个准入许可,但不响应中断;

3. tryAcquire() 尝试获得一个准入许可,成功返回true,失败返回false,不等待立即返回;

4. tryAcquire(long timeout, TimeUnit unit) 指定等待时间;

5. release() 在线程访问资源结束后释放一个许可;

三. ReadWriteLock 读写锁

1. 读读之间不阻塞;读写互相阻塞;写写互相阻塞;适合读操作次数远远大于写操作次数的系统;

四. CountDownLatch 倒计数器

public CountDownLatch(int count)

1. countDown() 一个线程已经完成了任务,计数器减1;

2. await() 主线程等待所有检测任务全部完成才能继续执行;

五. CyclicBarrier 循环栅栏

public CyclicBarrier(int parties, Runnable barrierAction) //等待计数的线程数量 一次计数完成后系统会执行的动作

1. await() 开始计数等待到达设置的数量;

2. 一次计数中如果有线程InterruptedException其他线程会BrokenBarrierException,避免由于一个线程被中断其他线程进行无谓的等待;

六. LockSupport 线程阻塞工具类

1. 与Thread.suspend() 相比,弥补了由于resume() 方法发生导致线程无法继续执行的情况;

2. 与Object.wait()相比,不需要先获得锁,也不会抛出InterruptedException;

3. park() WAITING状态,suspend() Runnable状态;park(Object) 阻塞对象会出现在线程Dump中;支持中断,Thread.interrupted() 可以获得中断标记;

七. 线程池

1. 线程数量过大会耗尽CPU和内存资源;线程的创建和关闭需要时间;线程本身占用内存,可能会给GC带来压力,甚至Out of Memory异常;

2. Excutors 线程池工厂

public static ExecutorService newFixedThreadPool(int nThreads) // 固定数量的线程池
public static ExecutorService newSingleThreadExecutor() // 只有一个线程的线程池
public static ExecutorService newCachedThreadPool() // 可根据实际数量调整的线程池
public static ScheduledExecutorService newSingleThreadScheduledExecutor() // 在给定时间执行某任务或周期性执行某任务
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) // 可指定数量

3. ForkJoinPool 线程池

被拆分的小任务通过fork() 提交给线程池进行处理;每个拆分的任务通过join() 汇总结果;

向ForkJoinPool提交ForkJoinTask,ForkJoinTask包含无返回值的RecursiveAction和有返回值的RecursiveTask;

JDK并发包

原文:https://www.cnblogs.com/bbbbs/p/12523853.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!