1、什么是JUC

:::tips image.png ::: java.util 工具包 :::tips image.png

image.png :::

2、线程和进程

进程:一个程序,程序的集合;
一个进程可以包含多个线程,至少包含一个
Java默认有几个线程:main、GC
线程:对于Java而言,Thread、Runable、Callable
Java真的可以开启多个线程吗
不可以,只能通过native方法进行调用,java无法操作硬件

并发:同一时间段
并行:同一时间(必须多核)

  1. //获取CPU的核数
  2. //CPU密集型,IO密集型
  3. System.out.println(Runtime.getRuntime().availableProcessors());

并发编程的本质:充分利用cpu的资源

线程有几个状态

共6个

  1. public enum State {
  2. //新生
  3. NEW,
  4. //运行
  5. RUNNABLE,
  6. //阻塞
  7. BLOCKED,
  8. //等待,死死的等
  9. WAITING,
  10. //超时等待
  11. TIMED_WAITING,
  12. //终止
  13. TERMINATED;
  14. }

wait/sleep的区别

1、来自不同的类
wait — Object
sleep — Thread

2、关于锁的释放
wait会释放锁,sleep抱着锁睡觉,不会释放

3、使用的范围不同

  • wait 必须在同步代码块中睡
  • sleep 可以在任何地方睡

4、异常的捕获
wait 不需要捕获异常 目前需要捕获了
sleep 必须捕获异常

3、Lock锁

image.png

一个接口和三个实现类

image.png

代码实现

image.png

通过构造方法来定义是否为公平锁

  • 公平锁:十分公平,先来后到
  • 非公平锁:十分不公平,可以插队(默认

传统Synchronized

  1. class Ticket{
  2. private int num=50;
  3. public synchronized void sale(){
  4. if(num>0){
  5. System.out.println(Thread.currentThread().getName()+"卖出了"+(num--));
  6. }
  7. }
  8. }

Lock

  1. //Lock锁
  2. class Ticket2{
  3. private int num=50;
  4. Lock lock = new ReentrantLock();
  5. public synchronized void sale(){
  6. lock.lock();
  7. try {
  8. if(num>0){
  9. System.out.println(Thread.currentThread().getName()+"卖出了"+(num--));
  10. }
  11. }catch (Exception e){
  12. e.printStackTrace();
  13. }finally {
  14. lock.unlock();
  15. }
  16. }
  17. }

区别: :::tips 1、Synchronized 是内置的关键字,Lock是一个java类
2、Synchronized 无法获取锁的状态,Lock可以判断是否获取到了锁
3、Synchronized 会自动释放锁,Lock锁必须要释放锁,否则会死锁
4、Synchronized 线程之间串行执行,一个阻塞,影响后续;Lock就不一定
5、Synchronized 可重入锁,不可以中断,非公平;Lock,可重入,可以自己设置公平性
6、Synchronized 时候锁少量的代码同步问题,Lock适合大量的同步代码 :::