本文共 3841 字,大约阅读时间需要 12 分钟。
并发编程工具包(java.util.concurrent) 锁 locks ReentrantReadWriteLock 实现了读写锁(ReadWriteLock) ReadLock WriteLock 实现了可重入锁(ReentrantLock) 不提供加锁服务,只提供锁 获取锁的方法 ReentrantReadWriteLock.readLock() ReentrantReadWriteLock.writeLock() StampedLock 三个模式 独享写 悲观读 乐观读 LockSupport 是一个线程工具类 静态工具类 所有方法都是静态的 方法 park 用于阻塞当前线程 unpark 用于唤醒被阻塞的线程 原子变量 atomic AtomicInteger get() 获得当前值 getAndXxx() 获得操作前的值并进行Xxx操作 XxxAndGet() Xxx操作并获得操作后的值 compareAndSet(expect, update) 和期望值相等则更新为update值,并返回true 不等则不更新 并且返回true/false AtomicReference 让引用到处可见,并保持原子性 AtomicLong AtomicBoolean AtomicArray DoubleAdder 分头计算,最后汇总,参考mapreduce思想 LongAccumulator 比LongAdder功能强大 可自定义计算规则 并发框架 Executor 三大件 工作单元 Runnable 不关注执行结果(不返回) Callable 关注执行结果(有返回) 工作单元执行 Executor 一个接口,定义了execute方法 ExecutorService Executor的子接口,定义了一系列线程池的基本操作接口 execute(Runnable) submit(Callable or Runnable) shutdown 关闭新的外部任务提交 shutdownNow 尝试中断正在执行的所有任务 isTerminated 是否所有任务已经关闭 isShutdown 是否该ExecutorService已被关闭 invokeAll(List) 有很多实现子类 工作单元执行结果 Future 定义了对任务执行结果的取消、状态查询、结果获取方法 cancel isCanceled isDone get 是接口 FutureTask Future的唯一实现类 其他 Executors 用于快速创建各类线程池 ScheduledExecutorService 定长的线程池 支持定时或周期性执行 FixedExecutorService 定长的线程池 防止线程滥用 CachedExecutorService 可灵活伸缩线程数 没有空闲线程回收,则创建新线程,有则回收再利用 SingleExecutorService 单线程的线程池 可指定执行顺序 FIFO LIFO 优先级 ForkJoin 三大件 执行任务的线程池 ForkJoinPool 方法 ForkJoinTask = pool.submit(forkJoinTask) 创建方式 new ForkJoinPool() 使用可用的处理器数量 ForkJoinPool.commonPool() 最大化使用全局系统资源 线程池中具体执行任务的线程 ForkJoinWorkerThread 由ForkJoinPool内部自行创建维护,不需显式地使用此类 运行在线程池中的任务 ForkJoinTask 抽象类 定义了主要操作接口 fork join invoke 主要实现 RecursiveAction 不关心结果 RecursiveTask 关心结果 并发容器 collections ConcurrentHashMap 对HashMap的升级 采用分段锁,提高了并发度 相比synchronize HashMap的全局加锁更加高效 读写都加锁 在多线程中使用可不用再自己实现任何并发控制 CopyOnWriteArrayList 适合读多写少的场景 拷贝写列表 写数据时,先拷贝一个副本,再写入副本 多份写同时进行,只保留一个结果,因此有一定风险 读不加锁 提高读效率 LinkedBlockingQueue 阻塞队列 方法 插入操作 add 立即返回 成功=true 无空间时则抛出:illegalStateException offer 立即返回 成功=true 无空间时=false 可指定超时时间,超时=false put 无空间时阻塞等待,直至插入成功 取出操作 poll 可指定超时时间 获取并移除队首元素 超时无元素返回则返回null take 获取并移除队首元素,没有元素则等待 ConcurrentLinkQueue ConcurrentSkipListMap 同步工具 tools Semaphore 信号量(许可证管理工具) 用于限制同时访问资源的线程数 方法 acquire 申请许可 可定义申请数量 阻塞方法 申请不到时会一直阻塞,因此申请数量不能大于许可证总数 tryAcquire 申请许可,并立刻返回结果 不阻塞 可定义申请数量 可定义超时时间 release 释放许可 和Synchronize的区别 前者可控制一个或多个并发 许可数为1的时候,两者无区别 CountDownLatch 同步计数器 可用于监听多线程的执行情况 可用于分头处理任务,最后总结处理 方法 countDown 计数器减一 await 阻塞到计数为0,才被唤醒执行 也可设置超时时间,到时间了计数不为0也可以继续往下执行 CyclicBarrier 循环栅栏(循环屏障) 类似同步计数器 所有线程都释放了对这个屏障的使用后,可重复使用这个屏障 方法 CyclicBarrier (int parties) 仅指定并发数,不指定动作 CyclicBarrier (int parties, Runnable barrierAction) 指定次数达成后,执行某个指定动作 await 等待指定次数达成后才被唤醒 也可指定超时时间 Phaser 移相器 更倾向重用的循环栅栏 方法 register 注册一个同步者 arriveAndAwaitAdvance 到达并提前等待 arriveAndDeregister 到达并取消注册 getRegisteredParties 获得注册的同步者数量 forceTermination 强制终止phase,phase对象不再可用 Exchanger 交换者 一对线程到达同步点时,可进行数据交换 方法 Object v2 = exchange(Object v1) 交出V1,得到对方的v2 一手交钱一手交货 可定义超时时间
转载地址:http://inbgi.baihongyu.com/