前言:面试中被问到这个问题。
我:①、sleep和wait的实现不一样,②、对待锁的处理不一样。
面试官:那么你具体说说。
我:好,给我张纸和笔,开启超神模式(希望不是真实伤害0.5)
第一点,就是sleep和wait的实现不一样(其实这话好像是废话,但是吧,你只有知道这个,下面才有的说),sleep是Thread的静态方法,如图:
wait是Object的方法,如图:
解释下,sleep是线程的静态方法,是线程用来控制自身流程的,也就是说它会使此线程暂停执行一段时间,把执行机会让给其他的线程。睡眠时间一过,此线程就会自动“苏醒”。而wait方法是Object的方法,他是用于线程之间的通信(注意是线程之间的通信,也就是说他是个中间人),该方法会使当前拥有该对象锁的线程等待,直到其他线程调用了notify、notifyAll或者wait超时才会“苏醒”。这里举个wait例子,看他是否真会卡在那,如图:
没有设置wait超时时间,没有调用notify和notifyAll,当i>3的时候,就执行不下去了。
第二点:对待锁有什么不一样,由于sleep是Thread的静态方法,所以他是不会释放锁的。而wait则不一样,它会释放锁。看代码立马让你明白,首先看下sleep方法,如图:
打印的结果能够看得出线程1睡眠了5s但是在这5s之前没有释放锁(因为线程2执行了10s),也就是说,在线程1执行完后,线程2才执行的。
线程1已经调用了wait,但是线程2还是执行了。如果线程1没有释放锁,那么线程2会一直处在等待状态,然而并没有。所以证明wait是释放锁的。
从代码上相信大家可以理解了吧。
总结:
- 他们的实现原理不一样,sleep是线程静态方法,wait是Object方法;
- 对锁的处理机制不同,sleep不会释放锁,而wait会释放锁;
- 使用区域不用,sleep是哪都能用,wait只能在同步方法或者同步代码块中。
总结的这几点,在我代码中都有体现。大家也可以模拟写一下。