我们之前学习了几种实现线程安全的方式,现在我们来使用synchronized关键字实现线程安全的等待与通知
wait
wait,翻译过来就是等待的意思,那么我们在Java中的作用是什么呢?
wait是在Object类中的一个方法,这样我们在所有的类中都可以调用该方法,wait的作用是使当前线程进入阻塞状态并释放锁,需要调用notify唤醒
notify
notify也是Object类中的一个方法,由另一个线程调用唤醒被wait阻塞的线程
如果有多个线程被wait阻塞了,那么notify则会唤醒优先级最高的那一个线程
notifyAll
顾名思义,唤醒所有被wait阻塞的线程
代码
/**
* @author LFDMW
*/
class MyRunnable implements Runnable {
private int num = 0;
@Override
public void run() {
while (true) {
synchronized (this) {
// 当一个线程进到这里, 会调用notify去唤醒一个被wait阻塞的线程
notify();
if (num < 1000) {
num++;
System.out.println(Thread.currentThread().getName() + "" + num);
try {
// 线程每次执行之后进入阻塞状态,等待唤醒,并且会释放锁(不然其他线程进不来哦)
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
break;
}
}
}
}
}
class MyRunnableTest {
public static void main(String[] args) {
MyRunnable m = new MyRunnable();
Thread t1 = new Thread(m);
t1.setName("线程1-");
t1.start();
Thread t2 = new Thread(m);
t2.setName("线程2-");
t2.start();
Thread t3 = new Thread(m);
t3.setName("线程3-");
t3.start();
}
}
本篇文章我们使用的是synchronized关键字来实现线程同步,下一篇文章我们讲解一下使用Lock锁实现线程安全的等待与通知