什么是JUC
JUC :是Java.util下的工具包、包、分类
线程和进程
进程: 一个程序,程序的集合,一个进程往往可以包含多个线程,至少包含一个
线程:进程的一种实体,一个进程至少有一个线程,是CPU、调度分配资源的最小单位
Java开启不了线程
并发、并行
并发:多线程操作同一个资源
并行:多个线程可以同时执行
并发编程的本质:充分利用CPU资源
线程有几个状态
-
新生(NEW)
-
运行(RUNNABLE)
-
阻塞(BLOCKED)
-
等待(WAITNG)
-
超时等待(TIMED_WAITING)
-
终止(TERMINATED)
wait/sleep的区别?
-
来自不同的类
wait => Object
sleep => Thread
-
关于锁的释放
wait会释放锁,sleep不会释放锁
-
使用的范围不同
wait必须在同步代码块中
sleep可以在任何地方
Synchronized和Lock的区别?
-
synchronized 内置关键字,Lock是一个Java类
-
synchronized 无法判断获取锁的状态,Lock可以判断是否获取到了锁
-
synchronized 会自动释放锁,Lock必须要手动释放
-
synchronized 可重入锁,不可以中断的,非公平的;Lock,可重入锁,可以判断锁,非公平
-
synchronized 适合锁少量的代码同步问题,Lock适合锁大量的同步代码
生产者和消费者问题
package com.zhong.pc;
/**
* 线程之间的通信问题:生产者和消费者问题! 等待唤醒,通知唤醒
* 线程交替执行 A B 操作同一个变量 num = 0
* A num + 1
* B num - 1
*/
public class A {
public static void main(String[] args) {
Data data = new Data();
new Thread(() ->{
for (int i = 0; i < 10; i++) {
try {
data.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"A").start();
new Thread(() ->{
for (int i = 0; i < 10; i++) {
try {
data.increment();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"B").start();
new Thread(() ->{
for (int i = 0; i < 10; i++) {
try {
data.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"C").start();
new Thread(() ->{
for (int i = 0; i < 10; i++) {
try {
data.decrement();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"D").start();
}
}
//判断等待,业务,通知
class Data{//数字 资源类
private int number = 0;
//+1
public synchronized void increment() throws InterruptedException {
//线程不等于0 进行while判断
if (number != 0){
//等待
this.wait();
}
//线程进行while循环结束,自增
number++;
System.out.println(Thread.currentThread().getName()+"=>"+number);
//通知其他线程,执行完毕
this.notifyAll();
}
//-1
public synchronized void decrement() throws InterruptedExceptifion {
if (number == 0){
//等待