登录
首页 >  文章 >  java教程

对象锁和类锁在多线程通信中有什么区别?

来源:php

时间:2024-10-24 14:49:09 404浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《对象锁和类锁在多线程通信中有什么区别?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

对象锁和类锁在多线程通信中有什么区别?

对象锁与类锁在多线程通信中的差异

在一个线程间通信的例题中,使用类锁和对象锁会导致不同的结果。具体地说,如果使用对象锁(this)可以正常运行,而使用类锁(printer_1.class) 却会抛出 java.lang.illegalmonitorstateexception 异常。

原因在于,使用类锁将整个类作为锁,而使用对象锁将实例对象作为锁。在本例中,您创建了两个不同的 printer_1 实例,并使用 wait() 和 notify() 方法对它们进行通信。在这种情况下,应该使用对象锁,因为每个线程都有自己的 printer_1 实例,应该使用实例本身作为锁。

因此,正确的代码如下:

class Printer_1 implements Runnable{
    private int number = 0;
    @Override
    public void run() {
        while (true) {
            synchronized (this) {//使用对象锁能正常运行
                notify();
                if (number <= 100) {
                    System.out.println(Thread.currentThread().getName() + "打印数字:" + number);
                    number++;
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}

今天关于《对象锁和类锁在多线程通信中有什么区别?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:php 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>