wait() notify()搭配synchronize的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wait() notify()搭配synchronize的使用相关的知识,希望对你有一定的参考价值。

一直以为自己动多线程,使用过好像就懂了原理一样,其实是按部就班的写自己不知道原理的代码而已。

一些概念:

监视器:将监视器比作一个建筑,建筑里面有个特别的房间,房间中有一些数据,这些数据在同一个时间只能被一个线程占据。当一个线程进入到离开这个房间之前可以单独享有这些数据。

进入建筑---进入监视器

进入建筑的那个房间---获得监视器

占据房间---持有监视器

离开房间---释放监视器

离开建筑---退出监视器

结合线程的状态理解这些动作,再好的描述也不能表达出来对这些东西的感觉,只可意会。

当一段代码或数据对象用synchronize修饰时,这段代码或者数据就相当于建筑立面那个特别的房间,同一个时刻只能被一个线程享有,其他想占据这个房间的线程都按照一些规则排序,等里面的线程出去,或者“休息”的状态才能得逞~

持有监视器的线程在wait()暂时退出监视器,进入等待状态,先暂时的离开,一会还会回来。

notify()后不影响代码执行,当前线程暂停或者执行完成后,等待的线程会继续持有监控器。

 

一个简单的栗子

package studythread;

public class WaitAndNotify {
	class TestWait extends Thread{
		public void run(){
			test("wait线程"	);
		}
	}
	class TestNotify extends Thread{
		public void run(){
			test("notify线程");
		}
	}
	
	public void exe(){
		TestWait tw = new TestWait();
		tw.start();
		TestNotify tn = new TestNotify();
		tn.start();
	}
	
	//监视器
	public synchronized void test(String str){
			
			for(int i=0 ; i<10 ; i++){
				if(i == 5){
					try {
						
						wait();
					} catch (InterruptedException e) {
			
						e.printStackTrace();
					}
				}else{
					notify();
				}
				System.out.println(str +"-------------"+ i);
			}
	}
	
	public static void main(String[] args) {
		new WaitAndNotify().exe();
	}
}

 

以上是关于wait() notify()搭配synchronize的使用的主要内容,如果未能解决你的问题,请参考以下文章

notify,wait,synchronized实现线程间通知

为什么wait和notify只能在synchronized中?

wait()和notify()

synchronized wait notify 生产者消费者

面试官:为什么 wait/notify 必须与 synchronized 一起使用??

synchronized VS Lock, wait-notify VS Condition