二者区别
所属类:
wait()是定义在Object类中的一个方法。
sleep()是定义在Thread类中的一个静态方法。
用途:
wait()用于线程间的协作,它使得当前线程进入等待状态,直到其他线程调用notify()或notifyAll()方法。sleep()用于让当前线程暂停执行一段时间,它并不涉及线程间的通信。
锁的释放与持有:
二者都可以将线程由运行态变为阻塞态,当线程调用wait()时,它会释放当前对象的监视器(锁),允许其他线程访问该对象的同步代码块。当线程调用sleep()时,它不会释放锁,线程仍然持有它所拥有的锁。因此,其他线程无法进入同步的代码块,直到sleep()的时间结束。
中断响应:
wait()可以被其他线程通过调用interrupt()方法中断,抛出InterruptedException。
sleep()也可以被中断,但会抛出InterruptedException,并且此时会结束睡眠状态。
调用方式:
调用方式
wait()必须在同步代码块或同步方法中调用。
sleep()可以在任何地方调用,不需要持有锁。
wait作用范围
wait和notify一定要在同步代码块/方法中才能使用原因是
- 从功能实现角度每个对象在 Java 中都有一个监视器锁。当一个线程进入同步代码块或方法时,它会获取该对象的锁。只有持有对象锁的线程才能调用锁对象的wait()、notify() 或 notifyAll() 方法,使得当前线程进入等待状态并释放锁
- 从线程安全角度考虑,wait() 方法使线程进入等待状态,并释放对象的锁,这样其他线程可以进入同步代码块。而 notify() 和 notifyAll() 方法用于唤醒在该对象上等待的线程。为了确保线程之间的协调和数据的一致性,这些操作必须在一个已同步的上下文中进行。如果没有加锁的保护,可能会导致不一致的状态和难以追踪的并发问题