这里包括io、集合类和常用类
1、什么是juc
就是java.util三个工具包
1)java.util.concurrent
2)java.util.concurrent.atomic
3)java.util.concurrent.locks
2、为什么用juc
原因一:项目中有些业务无法用普通的Thread和Runnable实现,后者要用到了Thread静态代理来执行,后者比前者灵活,但和callable相比效率低没有返回值,所以使用callable,而这个就在juc下,Lock也在juc下。
2、线程和进程
进程:比如qq.exe执行后就是进程,而Java中jar包执行也是进程,程序集合是静态的,执行后就是动态的,即进程。
线程:一个进程包含多个线程,至少一个,而Java中是默认两个线程,分别是mian线程和gc线程,前者是用户线程,后者是守护线程,守护线程会随着用户线程结束而结束,类比生活中使用情况就是打开qq之后,在这个进程里可以启动听歌线程,也可以启动学习线程等。
3、并发和并行
并发:多线程操作同一个资源,如果cpu一核,则通过快速交替模拟出多条线程。(并发编程的本质:重复利用cpu的资源,等产品牛了肯定要考虑性能,那就必然用到并发编程,所以必须要会)
并行:多核cpu下,多个线程可以同时执行,比如线程池。(多个人一起行走)
4、线程有几种状态
源码中是6种:新生、运行、阻塞、等待(一直等)、超时等待和终止
简单来说应该是新生、运行、阻塞和终止四种状态。
5、wait和sleep区别
1)来源不同
wait是Object类下
sleep是juc下
2)是否释放锁
wait是清醒的,所以会释放锁
sleep是抱着锁睡觉,所以不释放锁
3)使用场景不同
wait是只能用于同步代码块中(需要某地等人)
sleep可以用在任何地方(一个人随时随地睡觉)
4)是否捕获异常
1)wait不需要捕获异常
2)sleep必须捕获异常
6、传统的Synchronized锁
写个三个人卖票的代码
以前是写个Ticket类然后实现Runnable接口,里面写总票加粗样式数这个属性,加上卖票的方法;然后在main函数中new Thread方法里放Runnable并执行start方法;
但实际项目中为了耦合度,所以不会让Ticket类实现Runnable接口,如果实现这个效果,只需要在main函数中的new Thread里面直接用Runnable的lambda表达式即可,for循环也写在这里,如下所示:
但明显这个代码是有线程安全的,所以可以在Ticket类卖票这个方法前面加上sychronzied。
7、Lock锁
Lock是juc下的一个接口,所以需要用到实现类,常用实现类是可重入锁ReentrantLock:
Lock lock = new ReentrantLock()
(可以改为有参构造,加上true