为什么80%的码农都做不了架构师?>>>
面试中常问的就是 sleep 和 wait 有什么不同吗?为了面试时候发挥的更好,我在这里总结分享下。
首先对于 sleep() 方法,我们首先要知道该方法是属于 Thread 类中的。而 wait() 方法,则是属于Object类中的。(说完这句之后面试官会不会问你说下 object 类中的方法。。。哈哈哈)
最主要是 sleep 方法不会释放对象锁 ,而 wait 方法释放对象锁 。
sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争 cpu 的执行时间。
因为 sleep() 是 static 静态的方法,他不能改变对象的机锁,当一个 synchronized 块中调用了 sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依然无法访问这个对象。
当一个线程执行到 wait 方法时,它就进入到一个和该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过 notify,notifyAll 方法来唤醒等待的线程。
package com.example.demo;public class T {public static void main(String[] args) {new Thread(new t1()).start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}new Thread(new t2()).start();}private static class t1 implements Runnable {@Overridepublic void run() {synchronized (T.class) {System.out.println("start t1...");System.out.println("t1 wait...");try {// 调用 wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池T.class.wait();} catch (Exception e) {e.printStackTrace();}}System.out.println("t1 going on....");System.out.println("t1 over...");}}private static class t2 implements Runnable {@Overridepublic void run() {synchronized (T.class) {System.out.println("start t2...");System.out.println("t2 sleep...");// 只有针对此对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。T.class.notify();try {// sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。// 在调用 sleep()方法的过程中,线程不会释放对象锁。Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}System.out.println("t2 going on....");System.out.println("t2 over...");}}}
}
第一种情况结果,使用 wait 释放锁,并且唤醒等待线程。
第二种情况不唤醒等待线程,注释掉
T.class.wait();
结果程序会一直挂起。
水平有限,若有问题请留言交流!
互相学习,共同进步:) 转载请注明出处谢谢!