java wait()notify释放锁

1  调用obj.wait()会立即释放锁,
,以便其他线程可以执行obj.notify(),但是notify()不会立刻立刻释放sycronized(obj)中的obj锁,必须要等notify()所在线程执行完synchronized(obj)块中的所有代码才会释放这把锁.

//而 yield(),sleep()不会释放锁。 见如下代码:

public class WaitNotify {

	static boolean flag = true;
	static Object lock = new Object();

	public static void main(String[] args) throws Exception {
		Thread waitThread = new Thread(new Wait(), "WaitThread");
		waitThread.start();
		TimeUnit.SECONDS.sleep(1);
		Thread notifyThread = new Thread(new Notify(), "NotifyThread");
		notifyThread.start();
	}

	static class Wait implements Runnable {
		public void run() {
			// 加锁,拥有lock的Monitor
			synchronized (lock) {
				// 当条件不满足时,继续wait,同时释放了lock的锁
				while (flag) {
					try {
						System.out.println(Thread.currentThread()
								+ " flag is true. wait@ "
								+ new SimpleDateFormat("HH:mm:ss")
										.format(new Date()));
						lock.wait();
					} catch (InterruptedException e) {
					}
				}
				// 条件满足时,完成工作
				System.out.println(Thread.currentThread()
						+ " flag is false. running@ "
						+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
			}
		}
	}

	// wait()会立刻释放synchronized(obj)中的obj锁,以便其他线程可以执行obj.notify()
	// 但是notify()不会立刻立刻释放sycronized(obj)中的obj锁,必须要等notify()所在线程执行完synchronized(obj)块中的所有代码才会释放这把锁.
	// yield(),sleep()不会释放锁
	static class Notify implements Runnable {
		public void run() {
			// 加锁,拥有lock的Monitor
			synchronized (lock) {
				// 获取lock的锁,然后进行通知,通知时不会释放lock的锁,
				// 直到当前线程释放了lock后,WaitThread才能从wait方法中返回
				System.out.println(Thread.currentThread()
						+ " hold lock. notify @ "
						+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
				lock.notifyAll();
				flag = false;
				try {
					Thread.currentThread().sleep(5000l);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			// 再次加锁
			synchronized (lock) {
				System.out.println(Thread.currentThread()
						+ " hold lock again. sleep@ "
						+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
				try {
					Thread.currentThread().sleep(5000l);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

}

运行结果:

Thread[WaitThread,5,main] flag is true. wait@ 15:33:26
Thread[NotifyThread,5,main] hold lock. notify @ 15:33:27
Thread[NotifyThread,5,main] hold lock again. sleep@ 15:33:32
Thread[WaitThread,5,main] flag is false. running@ 15:33:37

    原文作者:java锁
    原文地址: https://blog.csdn.net/a314773862/article/details/54095149
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞