浅谈sleep方法和wait方法的异同

2019-07-30  本文已影响0人  LvLz

很久之前的文章了,希望对大家有所帮助。

sleep方法和wait方法异同点是什么?

相同点:

二者都可以让线程处于冻结状态。

不同点:

首先应该明确sleep方法是Thread类中定义的方法,而wait方法是Object类中定义的方法。

针对以上4点,这里举一个小例子:

synchronized(obj) {
    wait();//0 1 2
    code....
}

synchronized(obj) { 
    notifyAll();//3
    code....
}

假设此时在wait方法上可能有多个线程例如Thread0、Thread1、Thread2,他们都被存储到了线程池中,同时将锁放掉。与此同时,Thread3开始执行下方的同步代码块,当Thread3执行到notifyAll时,0、1、2三个线程都将被唤醒。此时,在同步中就同时存在多个线程,那么此时会引发多线程的安全问题吗?

答案是不会的,因为在同步中的线程如果想要执行,不但要有执行权,还必须要持有锁,而此时锁在Thread3手中,所以只有当Thread3执行完代码释放了锁后,其他线程才有机会拿到锁继续执行。

看到这里我们可以拓展出一个问题:当一个线程进入一个对象的一个synchronized方法后,其他线程是否可以进入此对象的其他方法?

这个问题的答案分为以下几种情况:
1.其他方法前是否加了synchronized关键字,如果没加,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他的方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的同步锁是this。

个人感觉,在学习多线程这部分的知识时,弄清楚何时拿锁,何时放锁,是极为重要的。

上一篇 下一篇

猜你喜欢

热点阅读