
对象锁与类锁在多线程通信中的差异
在一个线程间通信的例题中,使用类锁和对象锁会导致不同的结果。具体地说,如果使用对象锁(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;
}
}
}
}
}以上就是对象锁和类锁在多线程通信中有什么区别?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号