一、JUC是什么?
-
JUC既:java.util.concurrent包下的工具类,是JDK1.5开始的用于处理多线程
进程和线程
进程:
-
进程是操作系统对系统资源进行调度和分配的基本单位,例如我们启动一个应用,每一个进程里面有包含许多线程
线程:
-
线程就是操作系统进行操作运算的最小单位,我们打开一个应用在里面操作各种功能就是每一个线程进行运作
线程的状态:
-
NEW 新建一个线程但是尚未启动的线程处于此状态。
-
RUNNABLE 在Java虚拟机中执行的线程处于此状态。
-
BLOCKED 被阻止等待监视器锁定的线程处于此状态
-
WAITING 无限期等待另一个线程执行特定操作的线程处于此状态。
-
TIMED_WAITING 等待另一个线程执行操作达指定等待时间的线程处于此状态。
-
TERMINATED 已退出的线程处于此状态。
wait和sleep:
-
wait 是Object类中的一个方法,任何实例对象都可以调用此方法且线程会处于等待状态,但是调用它的前提是需要当前线程持有锁
-
sleep 是Thead类中静态方法,它不需要持有锁就可以调用同时也不会释放锁
-
共同点:它们都会被interrupted方法终端
并发和并行:
-
并发:同一时刻多个线程访问同一资源,例如:买票,秒杀
-
并行: 多个程序同时运行,互不影响,多项工作用时进行
管程:
-
既Monitor,监视器通俗的讲就是用来管理线程的
-
是一种同步机制,既保证同一时间只有一个线程能够访问某一块公共资源
用户线程和守护线程:
-
用户线程:既平常我们自己创建的线程、主线程结束其它线程任然在运行
-
Thread thread = new Thread(() -> { System.out.println("自定义线程" + Thread.currentThread().getName() + "是否为守护线程:" + Thread.currentThread().isDaemon()); }, "线程名称:aa"); thread.start(); -
守护线程:既后台默默执行的线程,比如垃圾回收机制、主线程运行结束其它线程也跟着结束
二、synchronized
概念: Java 中的关键字,同步锁,自动上锁和自动解锁,发生异常时会自动释放锁
-
修饰对象:
-
代码块
-
方法
-
静态方法
-
类
-
Lock锁
概念: Java中的一个接口,同步锁,需要自己上锁和解锁,发送异常时不会自动释放锁
-
实现类:
-
ReentrantLock:可重入锁
-
当某一个线程拥有可重入锁时,在进入多层需要锁的时候会自动获得锁。
-
public class ThreadDemo2 {
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment() throws InterruptedException {
lock.lock();
try {
while (number != 0){
condition.wait();
}
number++;
System.out.println("线程名称为:" + Thread.currentThread().getName() + "操作" + number);
condition.signalAll();
}finally {
lock.unlock();
}
}
public void decrement() throws InterruptedException {
lock.lock();
try {
while (number != 1){
condition.wait();
}
number--;
System.out.println("线程名称为:" + Thread.currentThread().getName() + "操作" + number);
condition.signalAll();
}finally {
lock.unlock();
}
}
ThreadDemo2 t2 = new ThreadDemo2();
new Thread(() -> {
try {
for (int i = 1; i <= 10; i++) {
t2.increment();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"AA").start();
new Thread(() -> {
try {
for (int i = 1; i <= 10; i++) {
t2.decrement();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
},"BB").start();


