微信网站怎么收款,网站做专题主题该怎么选,省建设厅执业资格注册中心网站,足球直播网站怎么做目录 一、什么是监视器#xff08;Monitor#xff09;二、监视器的组成部分三、线程的状态转换四、总结 一、什么是监视器#xff08;Monitor#xff09;
在Java中#xff0c;监视器#xff08;Monitor#xff09;是用来实现线程同步的一种机制。每个Java对象都有一个与… 目录 一、什么是监视器Monitor二、监视器的组成部分三、线程的状态转换四、总结 一、什么是监视器Monitor
在Java中监视器Monitor是用来实现线程同步的一种机制。每个Java对象都有一个与之关联的监视器线程可以通过synchronized关键字来获取和释放对象的监视器。监视器的主要作用是确保在同一时刻只有一个线程可以执行同步块或同步方法从而实现线程的互斥访问。
二、监视器的组成部分
监视器通常包含以下三个关键部分
入口集Entry List等待获取监视器锁的线程集合。所有者线程Owner Thread当前持有监视器锁的线程。等待集Wait Set调用了wait()方法并进入等待状态的线程集合。
线程等待的地方
入口集Entry List线程在尝试进入同步块或同步方法时如果无法获取监视器锁它们会进入入口集等待。这些线程处于阻塞状态等待获取监视器锁。
等待集Wait Set线程在调用wait()方法后会释放监视器锁并进入等待集。这些线程处于等待状态直到被其他线程通过notify()或notifyAll()方法唤醒。
三、线程的状态转换
线程状态转换示意图 以下是线程在不同状态之间转换的过程示意图
新建状态New线程被创建但尚未启动。可运行状态Runnable线程已经启动可以运行但不一定正在运行。阻塞状态Blocked线程在入口集中等待获取监视器锁。等待状态Waiting线程在等待集中等待其他线程通过notify()或notifyAll()唤醒。超时等待状态Timed Waiting线程在等待集中等待特定时间后被唤醒。终止状态Terminated线程已经结束执行。
示例代码解释 我们通过一个示例代码来解释线程在不同状态之间的转换
public class MonitorExample {private static final Object lock new Object();public static void main(String[] args) {Thread thread1 new Thread(() - {synchronized (lock) {try {System.out.println(Thread 1: Acquired lock, entering wait state.);lock.wait();System.out.println(Thread 1: Woken up, reacquired lock.);} catch (InterruptedException e) {Thread.currentThread().interrupt();}}});Thread thread2 new Thread(() - {synchronized (lock) {System.out.println(Thread 2: Acquired lock, notifying.);lock.notify();System.out.println(Thread 2: Notified, releasing lock.);}});thread1.start();try {Thread.sleep(100); // Ensure thread1 starts first and enters wait state} catch (InterruptedException e) {Thread.currentThread().interrupt();}thread2.start();}
}过程解释 Thread 1 获取监视器锁
Thread 1 进入同步块并获取监视器锁。 调用lock.wait()方法Thread 1释放监视器锁并进入等待集。 Thread 2 获取监视器锁
Thread 2 进入同步块并获取监视器锁此时Thread 1已在等待集。 调用lock.notify()方法唤醒等待集中的一个线程即Thread 1。 Thread 2 释放监视器锁
Thread 2 退出同步块释放监视器锁。 Thread 1 重新获取监视器锁
被唤醒的Thread 1从等待集中移动到锁池重新竞争获取监视器锁。 Thread 1成功获取监视器锁后从wait()方法返回继续执行后续代码。
四、总结
监视器Monitor用于实现线程同步每个Java对象都有一个监视器。
入口集Entry List线程在尝试进入同步块或同步方法时如果无法获取监视器锁会进入入口集等待。
等待集Wait Set线程在调用wait()方法后会释放监视器锁并进入等待集等待被唤醒。
状态转换线程在不同状态之间转换包括新建、可运行、阻塞、等待、超时等待和终止状态。