一. 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;
原文:https://www.cnblogs.com/bbbbs/p/12523853.html