# juc **Repository Path**: strive_chen/juc ## Basic Information - **Project Name**: juc - **Description**: juc学习 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-03 - **Last Updated**: 2021-01-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # juc 多线程编程模板上 1.线程 操作 资源类 2.高内聚低耦合 多线程编程模板中:(线程间通信) 1.判断 2.干活 3.通知 多线程编程模板下:(线程间通信) 防止虚假唤醒(while) juc:java.util.concurrent包,又称concurrent包 1.知识点回顾 进程:一个功能齐全的应用程序,计算分配资源以及执行的基本单元 线程:CPU执行的基本单位,使用进程的资源 并行:同一个时刻针对不同资源的操作 并发:同一个时刻针对同一个资源的操作 sleep:握着锁去睡,thread对象 wait:松开手去睡,Object对象 4种初始化线程: 1.继承Thread基类 2.实现Runnable接口 1.自定义一个实现类实现Runnable接口 2.匿名内部类的方式 3.lambda表达式方式 3.实现Callabl接口 4.线程池 lambda回顾: 当一个接口中有且仅有一个抽象方法时,才能使用lambda表达式。 为了防止别人在函数式接口中添加抽象方法,可以添加@FunctionInterface注解强制约束该接口。 函数式接口中可以有两类其他方法: 1.default方法 2.static方法 synchronized:非公平悲观独占排他锁 ReentrantLock:可重入锁 等价于 synchronized 初始化锁:new ReentrantLock 加锁:lock.lock(); 解锁:lock.unlock(); 线程间通信: 传统:加锁synchronized 等待:this.wait() 唤醒:this.notify()/notifyAll() juc:加锁reentrantlock 通信对象:reentranLock.newCondition() 等待:condition.await() 唤醒:condition.signal()/signallAll(); 并发容器类: List: ArrayList:线程不安全(synchronized lock) Vector:线程安全的。张展因子默认是1倍,性能有一定的折损 SynchronizedList:线程安全的。Collections的内部类(本质就是arrayList的封装),迭代器不带synchronized CopyOnWriteArrayList:线程安全的。浪费内存,数据一致性无法保证 COW容器:写时复制容器,写的时候复制一份,在新的容器中完成写的操作。读写分离 8锁问题: synchronized在不同的地方,锁的范围不同: 1.静态同步方法,锁类 2.普通同步方法,锁对象 3.同步代码块,锁的是括号中的资源 Callable接口编写多线程程序。 thread和Runnable都不能解决两个问题: 1.无法获取子线程的返回结果集 2.主线程无法捕获子线程的异常 这两个问题通过Callable都可以解决。 FutureTask --> RunnableFuture接口 --> Runnable / Future 1.获取子任务的返回结果集 2.捕获子任务的异常 3.get方法会阻塞主线程 4.复用既有的计算结果 多线程实现方式: 1.继承Thread基类 2.实现Runnable接口 3.实现Callable接口 + FutureTask 4.线程池 Runnable和Callable区别? 都可以初始化多线程程序。 1.实现Runnable接口,实现Callable接口 2.重写run方法,重写call方法 3.callable可以获取子任务的返回结果 4.callable可以捕获子线程的异常信息