Java的juc相关容器,工具,框架介绍

主要介绍Java相关并发容器,原子类,以及线程池框架

Java相关并发容器

  • ConcurrentHashMap采用分段锁提升效率
  • ConcurrentLinkedQueue非阻塞链表队列,采用CAS方式实现线程安全
  • 阻塞队列,通过持有锁对象实现通知/等待的队列

JDK 7提供了7个阻塞队列,如下。

  • ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

比较常用的就是ArrayBlockingQueue和LinkedBlockingQueue以及SynchronousQueue,其他队列比较专用.

Java的juc相关容器,工具,框架介绍_第1张图片
ArrayBlockingQueue对线程安全的控制

所有的阻塞队列实现基本上都会依托于等待/通知模型,基本会借助于锁做安全同步,Condition做等待通知。

原子操作

AtomicInteger,AtomicLong,AtomicReference等Atomic开头的原子操作,可以便捷的实现CAS操作

最常用的就是上面3个Atomic原子方法,比较常用的方法有

  • incrementAndGet()增加1并返回原值
  • compareAndSet(expect,update)原子方式进行设置,如果失败返回false,一般会自旋调用此方法来保证线程安全的设置值,如果返回false就更新expect值继续设置,incrementAndGet()方法实现就是如此。引用对象也可以这么玩。

最底层的CAS操作还是要Unsafe包进行本地方法调用。AtomicInteger的compareAndSet()方法如图


Java的juc相关容器,工具,框架介绍_第2张图片
AtomicInteger的compareAndSet()方法

并发工具

CountDownLatch:允许一个或多个线程等待其他线程完成操作。
CyclicBarrier:循环屏障,让一组线程到达一个屏障(同步点)被阻塞,直到最后一个线程到达屏障时,屏障才打开
Semaphore:信号量,用来控制同时访问特定资源的线程数量

Java的juc相关容器,工具,框架介绍_第3张图片
CountDownLatch部分代码

很多并发工具都是依托于AQS实现,就像上面的CountDownLatch实现使用的是一个共享锁,每次调用都会将count减小1(tryReleaseShared()方法),一直到count减到0才释放同步状态,激活await()的等待线程以达到同步。

线程池技术

线程池:使用的队列都是阻塞队列,内层阻塞还是采用等待/通知模型

Java的juc相关容器,工具,框架介绍_第4张图片
线程池主要处理流程

ThreadPoolExecutor执行execute方法主要流程。

  • 如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(注意,执行这一步骤 需要获取全局锁)。
  • 如果运行的线程等于或多于corePoolSize,则将任务加入BlockingQueue。
  • 如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务(注意,执 行这一步骤需要获取全局锁)。
  • 如果创建新线程将使当前运行的线程超出maximumPoolSize,任务将被拒绝,并调用 RejectedExecutionHandler.rejectedExecution()方法。

正确的理解好线程池的处理流程能够根据实际情况更好的配置参数

其他

理解了并发编程所面临的问题之后,使用并发工具可以更方便的解决通用问题以及安全的使用容器。

你可能感兴趣的:(Java的juc相关容器,工具,框架介绍)