java并发编程中wait notify

本文深入探讨了Java中线程的同步机制,通过具体代码示例解释了synchronized关键字的作用,以及线程如何通过wait和notify方法进行等待和唤醒的过程。文章详细展示了线程在获取对象锁、等待和唤醒的状态转换,以及线程间如何正确传递执行权。
摘要由CSDN通过智能技术生成

public class Testt {
public static ArrayList ls = new ArrayList();

public static void add(Object o) {
	ls.add(o);
}

public static int size() {
	return ls.size();
}

public static void main(String[] args) throws InterruptedException{
	
	Object obj = new Object();
	
	Thread th1 = new Thread(new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			synchronized (obj) {
				System.out.println("Thread1 start");
				for (int i = 0; i < 10; i++) {
					add(new Object());
					System.out.println("add" + i);
					if (i == 5) {
						System.out.println("th1 i==5 start obj notify");
						obj.notify();
						System.out.println("th1 i==5 end obj notify");
						try {
							System.out.println("i==5 start obj.wait");
							obj.wait();
							System.out.println("Thread1 从wait中唤醒开始执行");
						} catch (InterruptedException e) {
							// TODO: handle exception
						}
						System.out.println("th1 end notify ");
					}
					
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				System.out.println("线程1执行结束");
			}
		}
	}, "THREAD2");
	
	Thread th2 = new Thread(new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("Thread2 start");
			synchronized (obj) {
				System.out.println("Thread2 start");
				System.out.println("thread2 拿到锁");
				if(ls.size() != 5) {
					try {
						System.out.println("thread2 start wait");
						obj.wait();
						System.out.println("thread2 end wait");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
					
				System.out.println("thread2 rebegin notify");
				obj.notify();
				try {
					Thread.sleep(5000);
				} catch (Exception e) {
					// TODO: handle exception
				}
				
			}
			System.out.println("线程2执行结束");
		}
	}, "THREAD1");
	
	th2.start();
	th2.sleep(1000);
	th1.start();
}

}

输出结果为:Thread2 start
Thread2 start
thread2 拿到锁
thread2 start wait
Thread1 start
add0
add1
add2
add3
add4
add5
th1 i5 start obj notify
th1 i
5 end obj notify
i==5 start obj.wait
thread2 end wait
thread2 rebegin notify
线程2执行结束
Thread1 从wait中唤醒开始执行
th1 end notify
add6
add7
add8
add9
线程1执行结束

可以看到,线程2执行完 notify()方法后,线程2不会马上释放该对象锁,呈 wait状态的线程也不能马上获得该对象锁,要等到线程退出 sychronized代码块后,线程2才会释放锁,而在同步队列中的线程1才可以获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值