今天写一个测试类,主要是测试wait(long timeout)到底会不会自动notify,到后来发现
一些很诡异的东西。
package com.hp.thread.chapter04; public class WaitAndNotify { private Object obj = new Object(); public static void testPureWait(){ new Thread(new Runnable(){ public void run() { synchronized (this) { try { System.out.println("thread 0"); wait(); System.out.println("thread 0 waited..."); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable(){ public void run() { synchronized (this) { try { System.out.println("thread 1"); wait(1000); System.out.println("thread 1 waited..."); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } public void testWait1000(){ new Thread(new Runnable(){ public void run() { System.out.println("thread 0 " + this); synchronized (obj) { while(true){ try { System.out.println("thread 0 running..."); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); new Thread(new Runnable(){ public void run() { System.out.println("thread 1 " + this); synchronized (obj) { try { while(true){ wait(1000); System.out.println("thread 1 waited..."); } } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } //通过打印出来的this,发现2个是不同的结果,为什么呢? //因为this是指向当前对象的引用,不过方法中都是new Thread(new Runnable(){}).start() //方式来生成,都是通过匿名的方式,所以每次的this都是指向new Thread()的WaitAndNotify对象 public void testWait1000_2(){ new Thread(new Runnable(){ public void run() { synchronized (this) { while(true){ try { System.out.println("thread 0"); System.out.println("thread 0 running..."); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); new Thread(new Runnable(){ public void run() { synchronized (this) { try { while(true){ System.out.println("thread 1"); wait(1000); System.out.println("thread 1 waited..."); } } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } public static void testWait(){ new Thread(new Runnable(){ public void run() { while(true){ synchronized (this) { try { System.out.println("..."); wait(); System.out.println("waited..."); notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); new Thread(new Runnable(){ public void run() { while(true){ synchronized (this) { try { notifyAll(); System.out.println("notify..."); wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); } /** * @param args */ public static void main(String[] args) { // testPureWait(); // testWait(); new WaitAndNotify().testWait1000(); } }
调用testWait1000_2方法得到的结果不是我期望(线程0始终在运行,线程1是不会运行的),但世界的结果恰恰相反,好事2个线程不相干,测试结果如下
thread 0 thread 0 running... thread 1 thread 1 waited... thread 0 thread 0 running... thread 1 thread 0 thread 0 running... thread 1 waited... thread 1
但是运行testWait1000正好是我要的结果,开始百思不得其解,后来打印this发现mystery了
thread 0 com.hp.thread.chapter04.WaitAndNotify$3@525483cd thread 0 running... thread 1 com.hp.thread.chapter04.WaitAndNotify$4@67f1fba0 thread 0 running... thread 0 running... thread 0 running... thread 0 running...
发现2个this的地址完全不一样,细想一下豁然开朗。
相关推荐
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java中synchronized用法
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
synchronized的几种示例研究,方法加锁,代码块加锁(this和对象)以及静态方法加锁的示例和效果。基本上包含了synchronized的几种常用的方式。
java synchronized的一些小实验,对帮助理解synchronized的使用有一定的帮助。
Synchronized关键字的用法
synchronized 测试案例,同步一个对象或者多个对象的案例均有,还有成功和失败案例的对比
java里面synchronized用法
你还在用synchronized?线程安全相关知识深入剖析
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
synchronized是很重要的,但是不少人不是很明白synchronized的用法,这里有详细的doc文档给大家参考
我自己的博客所附带的案例源码,我的博客标题名称是"synchronized并发讲解",关注我等待跟多更新
Synchronized与ThreadLocal
关于synchronized的自学笔记
java语言 并发编程 ReentrantLock与synchronized区别 详解
无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。 每个对象只有一个锁(lock)与之相关联。 实现同步是要很...
java中synchronized的使用,java中的锁锁的到底是什么?是括号里的代码块吗?肯定不是的;
java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来
java同步synchronized关键字用法示例
synchronized与单例的线程安全问题,博客地址:https://www.jianshu.com/p/486ed9c8662a