前言:面试中被问到这个问题。
我:①、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只能在同步方法或者同步代码块中。
总结的这几点,在我代码中都有体现。大家也可以模拟写一下。
Really many of fantastic tips.
phd dissertation proposals proposal argument paper
Nicely put, Kudos!
free online casino games no download online casino blackjack
Thank you! Wonderful stuff.
buy an essay paper
Truly loads of helpful facts.
essay on what can i do for my country pakistan my favorite writer essay in hindi
Thank you, Good stuff!
myself as a writer essay instant essay writer
Wow all kinds of excellent facts.
writer of geographical essay book write a note for me
Many thanks! A lot of write ups!
essay writers online cheap a website that writes essays for you
Wonderful data. Thank you.
how to write a good about me page for blog writers for essay