首页 > 编程语言 >Java的对象监视器

Java的对象监视器

时间:2024-07-07 23:30:55浏览次数:6  
标签:Java Thread 对象 lock 监视器 线程 等待 wait

什么是监视器(Monitor)?

在Java中,监视器(Monitor)是用来实现线程同步的一种机制。每个Java对象都有一个与之关联的监视器,线程可以通过synchronized关键字来获取和释放对象的监视器。监视器的主要作用是确保在同一时刻只有一个线程可以执行同步块或同步方法,从而实现线程的互斥访问。

监视器的组成部分

监视器通常包含以下三个关键部分:

  1. 入口集(Entry Set):等待获取监视器锁的线程集合。
  2. 所有者线程(Owner Thread):当前持有监视器锁的线程。
  3. 等待集(Wait Set):调用了wait()方法并进入等待状态的线程集合。

线程等待的地方

  • 入口集(Entry Set):线程在尝试进入同步块或同步方法时,如果无法获取监视器锁,它们会进入入口集等待。这些线程处于阻塞状态,等待获取监视器锁。
  • 等待集(Wait Set):线程在调用wait()方法后,会释放监视器锁并进入等待集。这些线程处于等待状态,直到被其他线程通过notify()notifyAll()方法唤醒。

线程状态转换示意图

以下是线程在不同状态之间转换的过程示意图:

  1. 新建状态(New):线程被创建,但尚未启动。
  2. 可运行状态(Runnable):线程已经启动,可以运行但不一定正在运行。
  3. 阻塞状态(Blocked):线程在入口集中,等待获取监视器锁。
  4. 等待状态(Waiting):线程在等待集中,等待其他线程通过notify()notifyAll()唤醒。
  5. 超时等待状态(Timed Waiting):线程在等待集中,等待特定时间后被唤醒。
  6. 终止状态(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();
    }
}

过程解释

  1. Thread 1 获取监视器锁

    • Thread 1 进入同步块并获取监视器锁。
    • 调用lock.wait()方法,Thread 1释放监视器锁并进入等待集。
  2. Thread 2 获取监视器锁

    • Thread 2 进入同步块并获取监视器锁(此时Thread 1已在等待集)。
    • 调用lock.notify()方法,唤醒等待集中的一个线程(即Thread 1)。
  3. Thread 2 释放监视器锁

    • Thread 2 退出同步块,释放监视器锁。
  4. Thread 1 重新获取监视器锁

    • 被唤醒的Thread 1从等待集中移动到锁池,重新竞争获取监视器锁。
    • Thread 1成功获取监视器锁后,从wait()方法返回,继续执行后续代码。

总结

  • 监视器(Monitor):用于实现线程同步,每个Java对象都有一个监视器。
  • 入口集(Entry Set):线程在尝试进入同步块或同步方法时,如果无法获取监视器锁,会进入入口集等待。
  • 等待集(Wait Set):线程在调用wait()方法后,会释放监视器锁并进入等待集,等待被唤醒。
  • 状态转换:线程在不同状态之间转换,包括新建、可运行、阻塞、等待、超时等待和终止状态。

标签:Java,Thread,对象,lock,监视器,线程,等待,wait
From: https://www.cnblogs.com/liyuelian/p/18289117

相关文章

  • 【Java】详解String类中的各种方法
    创建字符串常见的创建字符串的三种方式://方式一Stringstr="helloworld";//方式二Stringstr2=newString("helloworld");//方式三char[]array={'a','b','c'};Stringstr3=newString(array);"hello"这样的字符串字面值......
  • 03-码出高效:Java开发手册.pdf
    03-码出高效:Java开发手册.pdf03-码出高效:Java开发手册.pdfMySQL技术内幕InnoDB存储引擎第2版.pdf​​‍​​‍‍......
  • 03-码出高效:Java开发手册.pdf
    03-码出高效:Java开发手册.pdf03-码出高效:Java开发手册.pdf​​​​‍​​‍‍......
  • 基于Java“萌宠之家”宠物综合服务平台设计实现(源码+lw+部署文档+讲解等)
    \n文末获取源码联系感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询系统介绍:互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针......
  • 基于Java“镜头人生”约拍网站系统设计实现(源码+lw+部署文档+讲解等)
    \n文末获取源码联系感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询系统介绍:现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本“镜头人生”约拍网站就是在这样的大......
  • 基于Java:流浪动物领养信息系统设计实现(源码+lw+部署文档+讲解等)
    \n文末获取源码联系感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询系统介绍:现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本流浪动物领养信息系统就是在这样的大......
  • 基于Java“花鸣”B2C电子商务平台设计实现(源码+lw+部署文档+讲解等)
    \n文末获取源码联系感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询系统介绍:现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本“花鸣”B2C电子商务平台就是在这样......
  • 有一个日期(Date)类的对象和一个时间(Time)类的对象,均已指定了内容,要求一次输出其中的日期
            可以使用友元成员函数。在本例中除了介绍有关友元成员函数的简单应用外,还将用到类的提前引用声明,请读者注意。编写程序:运行结果:程序分析:        在一般情况下,两个不同的类是互不相干的。display函数是Time类中的成员函数,它本来只可以用来输出Tim......
  • 语法2-运算符、包机制、JavaDoc
    语法运算符运算符具有优先级-网上查(一般使用括号保证)/-除,%-取余符号-21/10二十一除十取余数,幂运算使用工具类表示Math.pow(2,3)-2的3次方++自加,--自减inta=3;intb=a++;//输出a=4,b=3intb=++a;//输出a=4,b=4==-等于,!=-instanceof-不等于逻辑运算符-与或非-&......
  • 类与对象(下)
    目录再谈构造函数构造函数体赋值初始化列表explicit关键字static成员概念特性友元友元函数友元类内部类特性:再次理解类和对象再谈构造函数构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值classDate{public:......