sleep、wait特点
sleep和wait的区别。
- sleep()方法是Thread类的静态方法,wait()方法是Object超类的成员方法。
- sleep不会让锁,让的是CPU,时间到了就立马执行(不需要竞争锁)。wait会,但要被notify唤醒去竞争锁。
- sleep可以在任何地方用,wait只能在同步代码方法或块中配合synchronized使用。
- sleep()方法需要抛出异常,wait()方法也需要,但notify不用。
sleep()和yield()区别
- sleep后进入阻塞(blocking)状态,yield后进入就绪(ready)状态
- sleep后让出执行机会时不考虑优先级,低优先级的线程就有机会了,而yield后会优先给优先级高的线程执行。
- sleep被阻断会显式抛出InterruptedException,而yiled不会。
- sleep有较好可移植性
同步方法和同步块的区别
- 同步方法默认用this或者当前类class对象作为锁,因而高开销;
- 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
- 同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
java同步机制的wait和notify
- wait()、notify()、notifyAll()都是Object的方法,而不是Thread的。
- 必须配合synchronized使用。且wait必须被try-catch捕获InterruptedException。
- notify()会通知等待(休眠)队列中的第一个线程,是公平的(jdk1.8的HotSpot虚拟机notify是公平的),谁先休眠谁就先被唤醒,不是根据线程优先级来的
- notifyAll()会通知所有线程,随机唤醒,也不是根据线程优先级来的。
sleep(0)的意义
Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确实的被冻结了一下,让一下CPU,让其他线程有机会优先执行,然后立马开始竞争CPU。所谓的cpu调度,就是根据一定的算法(优先级,FIFO等),从就绪队列中选择一个线程来分配cpu时间。
wait(),notify(),notifyAll()必须在同步(Synchronized)方法/代码块中调用
调用wait()方法就是释放锁,释放锁的前提是必须要先获取锁,先获取锁才能释放锁。
notify(),notifyAll()是将锁交给含有wait()方法的线程,让其继续执行下去,所以自身必须先有锁才行。