public class Test2 {
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> volatile Boolean aBoolean = <span class="hljs-keyword">true</span>;
<span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">A</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">Runnable</span>{</span>
@Override
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> run() {
synchronized (aBoolean){
<span class="hljs-keyword">while</span> (aBoolean){
<span class="hljs-keyword">try</span> {
System.out.println(<span class="hljs-string">"进入A, 等待中"</span>);
aBoolean.wait();
} <span class="hljs-keyword">catch</span> (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(<span class="hljs-string">"A over"</span>);
}
}
} <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">B</span> <span class="hljs-inheritance"><span class="hljs-keyword">implements</span></span> <span class="hljs-title">Runnable</span>{</span> @Override
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> run() { <span class="hljs-keyword">try</span> {
TimeUnit.SECONDS.sleep(<span class="hljs-number">3</span>);
} <span class="hljs-keyword">catch</span> (InterruptedException e) {
e.printStackTrace();
} synchronized (aBoolean){
System.out.println(<span class="hljs-string">"通知A可以运行了"</span>);
aBoolean = <span class="hljs-keyword">false</span>;
aBoolean.notifyAll();
<span class="hljs-comment">//Boolean.TRUE.notifyAll();</span>
}
}
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(String[] args) {
<span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> A()).start();
<span class="hljs-keyword">new</span> Thread(<span class="hljs-keyword">new</span> 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的方式

最新文章

  1. 用Powershell启用Windows Azure上的远程桌面服务
  2. MySQL Workbench的使用教程 (初级入门版)
  3. Java之异常处理机制
  4. 用UNIX消息队列实现IPC(以ATM为例)
  5. Fingerprinting
  6. 简析 addToBackStack使用和Fragment执行流程
  7. 【jmeter】基于InfluxDB&amp;Grafana的JMeter实时性能测试数据的监控和展示
  8. JS 异常: Uncaught RangeError: Maximum call stack size exceeded
  9. Spark Streaming揭秘 Day30 集群模式下SparkStreaming日志分析
  10. C语言--基本运算符
  11. 看IT牛人博客的哲理
  12. 译-what is cmdlet
  13. 【转】vim取消高亮显示
  14. nginx入门教程
  15. Java集合及concurrent并发包总结(转)
  16. 类加载(四):spring-boot-loader 模块
  17. socket练习--ssh
  18. 第二十五节:Java语言基础-面向对象基础
  19. WordPress无法显示Gravatar头像的解决方法
  20. SpringMVC+hibernate4事务处理

热门文章

  1. go package的理解
  2. vsphere client 参数
  3. 调色板原理 &amp; 编程
  4. Cronolog 分割 Tomcat8 Catalina.out日志 (转)
  5. cocos2d-x中六种持续性动作
  6. Javascript和jquery事件--鼠标移动事件mousemove
  7. js课程 4-12 js中正则表达式如何使用
  8. ssi的使用 开启 配置等
  9. php 如何写一个自己项目的安装程序
  10. LibCurl HTTP部分详细介绍