0

0

为什么使用类锁在多线程编程中会导致错误?

碧海醫心

碧海醫心

发布时间:2024-10-24 16:07:40

|

541人浏览过

|

来源于php

转载

为什么使用类锁在多线程编程中会导致错误?

线程间通信:使用对象锁与类锁的对比

在多线程编程中,线程间通信是一个至关重要的概念。一个常见的机制是使用对象锁,而另一个选项是使用类锁。

在提供的问题示例中,printer_1类使用对象锁实现了线程通信。在这个示例中,线程安全地打印从 1 到 100 的数字。代码如下所示:

public class threadtalk {
    public static void main(string[] args) {
        printer_1 printer = new printer_1();
        thread t1 = new thread(printer);
        thread t2 = new thread(printer);
        t1.setname("线程一");
        t2.setname("线程二");
        t1.start();
        t2.start();
    }
}

class printer_1 implements runnable {
    private int number = 0;

    @override
    public void run() {
        while (true) {
            synchronized (printer_1.class) {
                notify();
                if (number <= 100) {
                    system.out.println(thread.currentthread().getname() + "打印数字:" + number);
                    number++;
                    try {
                        wait();
                    } catch (interruptedexception e) {
                        e.printstacktrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}

在这种情况下,使用对象锁是正确的做法,因为它确保了每个线程只访问自己的打印机实例。

为什么使用类锁会报错?

然而,问题示例中指出,使用类锁会导致错误。原因如下:

LongCat AI
LongCat AI

美团推出的AI对话问答工具

下载

当使用 synchronized (printer_1.class) 时,类锁被持有。但是,在 run() 方法内部,线程却在使用 notify() 和 wait() 方法,这两个方法只能在持有对象锁时使用。在使用类锁时,持有的是类的锁,而不是对象锁。因此,当一个线程调用 wait() 时,类锁会被释放,而当另一个线程试图调用 notify() 时,就会抛出 illegalmonitorstateexception 错误。

解决方案

要解决这个问题,您应该在使用 wait() 和 notify() 方法时持有对象锁。在给出的示例中,正确的做法是:

synchronized (this) {
    ... your code ...
}

或者,也可以使用静态方法:

synchronized (Printer_1.class) {
    Printer_1.class.wait();
    Printer_1.class.notify();
}

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

465

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

13

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

60

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号