JUC中的Exchanger允许成对的线程在指定的同步点上通过exchange
方法来交换数据。如果第一个线程先执行exchange
方法,它会一直等待第二个线程也 执行exchange
方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将当前线程生产 出来的数据传递给对方。
JUC之CyclicBarrier
CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。CyclicBarrier默认的构造方法是CyclicBarrier(int parties)
,其参数表示屏障拦截的线程数量,每个线程调用await
方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。
JUC之CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作。定义CountDownLatch的时候,需要传入一个正数来初始化计数器(虽然传入0也可以,但这样的话CountDownLatch没什么实际意义)。其countDown
方法用于递减计数器,await
方法会使当前线程阻塞,直到计数器递减为0。所以CountDownLatch常用于多个线程之间的协调工作。
Java 内存模型
理解Java内存模型是深入学习Java并发不可或缺的部分。Java内存模型即Java Memory Model,简称为JMM,定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。
JMM规定Java线程间的通信采用共享内存的方式。在Java中,所有成员变量、静态变量和数组元素都存储在堆内存中,堆内存在线程之间共享,所以它们通常也称为共享变量。JMM定义了线程和主内存之间的抽 象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory,或者也可以称为工作内存 Work Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
Guava 杂项笔记
NIO2接口方法
JDK7对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为 NIO.2。因为NIO 提供的一些功能,NIO已经成为文件处理中越来越重要的部分。
Guava RateLimiter
Google Guava提供的RateLimiter
使用的是令牌桶算法。令牌桶算法的基本思想是以固定的速率生成令牌,在执行请求之前都需要从令牌桶里获取足够的令牌。当令牌数量不足的时候,请求将被阻塞进入等待状态或者直接返回失败。RateLimiter
常用于限制访问资源的速率。
Guava 缓存
Guava缓存是轻量级的,它将内容缓存到运行内存中。如果系统中某些值(比如一些配置表)被频繁查询使用,并且我们愿意消耗一些内存空间来提升应用的速度,减轻数据库压力的话,Guava缓存将会是一个不错的选择。由于缓存是存储在运行内存中的,所以我们需要确保缓存的大小不超出内存的容量。