关于java多线程中的wait和sleep方法和临界区的概念

来源:互联网 发布:python 相加不用运算符 编辑:程序博客网 时间:2024/05/13 18:12

1.这两个方法的所属不同,sleep属于Thread类中的。而wait()方法,则是属于Object类中的。

2.sleep方法使得线程暂停执行设置的时间,此时失去CPU的控制权但是他的Monitor监控状态依然存在,指定的时间过去之后他就又能开始执行了。

3sleep方法并不会释放对象锁但是呢wait()方法会释放对象锁

4.wait()方法必须在有锁的状态下才能够使用否则就会报错java.lang.IllegalMonitorStateException而sleep方法可以在任何时候使用。sleep方法需要捕获异常信息,而wait以及他的配套notifyAll,notify不需要捕获。


5.在这里我们要了解下临界区的概念:有时候你只是希望防止多个线程同时访问方法内部的部分代码而不是防止访问整个方法,通过这种方式分离出来的代码段被称为临界区她也使用synchronized关键字建立,这里

synchronized被用来指定某个对象,此对象的锁被用来指定某个对象此对象的锁被用来对花括号内的代码进行同步控制

synchronized(syncObject){

//this code can be accessed by only one task at a time

}

这也被称为同步控制块。在进入此段代码前,必须得到syncObject对象的锁,如果其他线程已经得到这个锁那么就要等待锁被释放以后才能进入临界区。通过使用同步控制块,而不是对整个方法进行同步控制,可以使得多个任务访问对象的时间和性能得到显著的提高。


6.有人问为啥有了sleep方法还要有wait呢?你可能会说wait能够暂停这个线程然后等待一个通知来让它醒过来,但是我可以说用sleep也可以做到啊,就是在sleep的时候interrupt()一下然后在异常捕获的catch中执行想做的事情呀。其实这里有个很大的区别就是,为啥要使用wait呢是因为可能有几个线程在争夺执行临界区的代码,但是呢如果在临界区有判断条件的使得它需要释放该锁的情况就要用wait然后用notiy来唤醒。

1 0