一、线程池
使用线程池可以提高性能,避免频繁的创建销毁
好处:
1).提高响应速度 (减少创建新线程的时间)
2).降低资源消耗 (重复利用线程池中的线程)
3).便于线程管理
1.ExecutorService:真正的线程池接口 常见子类是ThreadPoolExecutor
2.Executors:工具类,线程池的工厂类,用于创建并返回不同的线程池
二、线程总结
JUC
1.什么是JUC(缩写)
java.util.concurrent
java.util.concurrent.atomic(原子性)
java.util.concurrent.locks
这3个包
Runnable没有返回值,效率相比于Callable较低
JAVA默认有两个线程 main GC
JAVA无法直接操作硬件,通过底层的本地方法(C++)调用
2.并发编程的本质:充分利用CPU的资源
线程状态: new新生\ runnable运行 \blocked阻塞\waiting等待\timed_waitng超时等待\terminated终止
3.wait和sleep的区别
(1.所在类不同
wait—Object sleep—Thread
(2.锁的释放
wait会释放锁
(3. 使用的范围不同
wait必须在同步代码块中使用,sleep任何地方都可以
(4.异常捕获
wait不需要捕获异常
4.Lock锁(重点)
传统:synchronized
Lock接口有三个实现类 可重入锁(常用) 可重入的读锁 可重入的写锁
可重入锁中有公平锁和非公平锁,默认为非公平锁
公平锁:先来后到;非公平锁:可以插队
synchronized和lock的区别
1、synchronized是JAVA的一个内置关键字 lock是一个类
2、synchronized无法判断锁的状态,lock可以通过trylock()方法判断锁的状态
3、synchronized非公平 lock默认非公平,但可以设置
4、synchronized适合少量的代码同步问题,lock适合锁大量的同步代码
5、synchronized会自动释放锁,lock必须要手动释放
6、synchronized线程1获得锁之后,线程2会死等,lock锁不一定会等下去
5、生产者和消费者问题(Lock版)
注意:为防止线程被虚假唤醒,等待应总是出现在循环中,将if换成while