cmd目录切换
D:\>cd /d D:\Program Files\Java\jdk1.8.0_201\bin
1. JUC 简介
在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文中的 Collection 实现等;
2. volatile 关键字
volatile 关键字: 当多个线程进行操作共享数据时,可以保证内存中的数据是可见的;相较于 synchronized 是一种较为轻量级的同步策略;volatile 不具备"互斥性";volatile 不能保证变量的"原子性";
3. i++ 的原子性问题
i++的操作实际上分为三个步骤: "读-改-写";原子性: 就是"i++"的"读-改-写"是不可分割的三个步骤;原子变量: JDK1.5 以后, java.util.concurrent.atomic包下,提供了常用的原子变量;
原子变量中的值,使用 volatile 修饰,保证了内存可见性;CAS(Compare-And-Swap) 算法保证数据的原子性;
int i = 10;
i = i++;
3.1 CAS 算法
CAS(Compare-And-Swap) 算法是硬件对于并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问;CAS 是一种无锁的非阻塞算法的实现;CAS 包含了三个操作数:
需要读写的内存值: V进行比较的预估值: A拟写入的更新值: B当且仅当 V == A 时, V = B, 否则,将不做任何操作;
4. 并发容器类
Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能;
4.1 ConcurrentHashMap
ConcurrentHashMap 同步容器类是 Java5 增加的一个线程安全的哈希表;介于 HashMap 与 Hashtable 之间;内部采用"锁分段"机制替代Hashtable的独占锁,进而提高性能;此包还提供了设计用于多线程上下文中的Collection实现: ConcurrentHashMap,ConcurrentSkipListMapConcurrentSkipListSet, CopyOnWriteArrayList 和 CopyOnWriteArraySet;
当期望许多线程访问一个给定collection时,ConcurrentHashMap通常优于同步的HashMap;ConcurrentSkipListMap通常优于同步的TreeMap;当期望的读数和遍历远远大于列表的更新数时, CopyOnWriteArrayList优于同步的ArrayList;
4.2 CountDownLatch(闭锁)
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待;
5. 创建执行线程的方式三
相较于实现 Runnable 接口的方式,实现 Callable 接口类中的方法可以有返回值,并且可以抛出异常;
6. 同步锁(Lock)
参考 "java 多线程间通信"
7. ReadWriteLock(读写锁)
8. 线程八锁
9. 线程池
线程池提供了一个线程队列,队列中保存着所有等待状态的线程;避免了创建与销毁线程的额外开销,提高了响应速度;线程池的体系结构
java.util.concurrent.Executor: 负责线程的使用和调度的根接口;ExecutorService: 子接口,线程池的主要接口;ThreadPoolExecutor: 线程池的实现类;ScheduledExecutorService: 子接口,负责线程的调度;ScheduledThreadPoolExecutor: 继承了线程池的实现类,实现了负责线程调度的子接口;工具类: Executors
ExecutorService newFixedThreadPool(): 创建固定大小的线程池;ExecutorService newCachedThreadPool(): 缓存线程池,线程池中线程的数量不固定,可以根据需求自动更改数量;ExecutorService newSingleThreadExecutor(): 创建单个线程池, 线程池中只有一个线程;ScheduledExecutorService newScheduledThreadPool(): 创建固定大小的线程,可以延时或定时的执行任务;
public class TestThreadPool{
public static void main(String[] args){
9.1 线程调度
public class TestScheduledThreadPool{
public static void main(String[] args) throws Exception{
10 Fork/Join 框架
public class TestForkJoinPool{
public static void main(String[] args){ ForkJoinPool pool = new ForkJoinPool(); ForkJoinTask<Long> task = new ForkJoinSumCalculate(0L, 100000000L); Long sum = pool.invoke(task); System.out.println(sum); } } class ForkJoinSumCalculate extends RecursiveTask<Long>{ private static final long serialVersionUID = 24340990L; private long start; private long end; private static final long THURSHOLD = 10000L;
转载于:https://www.cnblogs.com/yutting/p/11445639.html
相关资源:尚硅谷JUC百度云链接