package com.yang.java;
/**
*wait():一旦执行此方法,当前线程就会进入阻塞状态,并释放同步监视器
notify():一旦执行此方法,就会唤醒被wait()的一个线程,如果有多个线程被wait,就唤醒优先级高的
notifyALL():一旦执行此方法就会唤醒被wait的线程
**/
import java.util.concurrent.locks.ReentrantLock;
public class ArrayTest {
public static void main(String[] args) {
Window3 td=new Window3();
Thread t1 = new Thread(td);
Thread t2 = new Thread(td);
t1.setName("窗口1");
t2.setName("窗口2");
t1.start();
t2.start();
}
}
/**
sysnchronized都可以解决线程安全问题
不同点:sysnchronized机制在执行完相应的同步代码以后
自动释放监视器
lock 需要手动的启动同步(lock()),同时结束也需要手动实现UnLock()
*/
class Window3 implements Runnable {
private int number=1;
private ReentrantLock lock=new ReentrantLock();
@Override
public void run() {
while (true) {
// try {
// lock.lock();
//
// } finally {
// lock.unlock();
// }
synchronized(this) {
//唤醒
notify();
if (number <=100) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + number);
number++;
try {
// sleep不会释放锁
// 使用调用wait方法让其阻塞,唤醒线程
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
break;
}
}
}
}
/**
private synchronized void show(){//同步监视器:this
//synchronized (this){
//}
}**/
}
wait()和sleep()方法的区别
相同点:一旦执行方法,都可以使得当前线程进入阻塞状态
不同点:两个方法声明位置不同,Thread类中声明Sleep(),Object声明在wait中
调用范围不同:sleep可以在任何需要的场景下调用,wait必须在同步代码块中
关于是否释放同步监听器:如果两个方法都使用在同步代码块或同步方法中,sleep不会释放锁,wait会释放锁