博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Boolean类型做为同步锁异常问题
阅读量:6366 次
发布时间:2019-06-23

本文共 1549 字,大约阅读时间需要 5 分钟。

public class Test2 {
private static volatile Boolean aBoolean = true; static class A implements Runnable{
@Override public void run() { synchronized (aBoolean){ while (aBoolean){ try { System.out.println("进入A, 等待中"); aBoolean.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("A over"); } } } static class B implements Runnable{
@Override public void run() { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (aBoolean){ System.out.println("通知A可以运行了"); aBoolean = false; aBoolean.notifyAll(); //Boolean.TRUE.notifyAll(); } } } public static void main(String[] args) { new Thread(new A()).start(); new Thread(new B()).start(); }}

运行结果:

进入A, 等待中通知A可以运行了Exception in thread "Thread-1" java.lang.IllegalMonitorStateException    at java.lang.Object.notifyAll(Native Method)    at Test2$B.run(Test2.java:39)    at java.lang.Thread.run(Thread.java:748)
由于我们会给aBoolean重新赋值, 导致对象监视器改变, 因为false和true这两个常量对应着两个不同的对象。当aBoolean产生变化时,很可能导致不同的线程同步了不同的对象解决方法: 将这一行 aBoolean.notifyAll();  改为: Boolean.TRUE.notifyAll();或者是用显示锁ReentrantLock的方式

转载地址:http://hyrma.baihongyu.com/

你可能感兴趣的文章
解決 yum update錯誤:[Errno -1] Metadata file does not match checksum
查看>>
ASP.NET(C#)Excel导入Dataset的出现数据值丢失问题
查看>>
我的友情链接
查看>>
『Data Science』R语言学习笔记,获取数据
查看>>
rails中n秒页面自动跳转
查看>>
我的友情链接
查看>>
忘记root用户密码怎么办?
查看>>
esxi定时任务
查看>>
Scaffold-DbContext
查看>>
关于VMware Workstation主机列表问题求教
查看>>
配置管理小报101021:给ubuntu加监控
查看>>
qml文字滚动效果的封装,实现方式运用的qml中提供的动画效果,另一种实现方式也可以使用定时器修改控件的坐标来实现...
查看>>
标准C++实现任务队列
查看>>
jdbc url
查看>>
刷leetcode第704题-二分查找
查看>>
debug_backtrace() 函数生成一个 backtrace(追踪)
查看>>
第七天,还是盒子
查看>>
XAMPP软件包下载
查看>>
XXL-JOB初体验-ORACLE版
查看>>
沉思录:别人的棺材
查看>>