引用
当线程调用wait()、sleep()、join()或者I/O *** 作时,将收到InterruptedException或者ClosedByInterruptException;
sleep()和wait()方法都是暂停当前正在执行的线程,出让CPU资源。
调用对象的wait()、notify()、notifyAll()方法的线程,必须是作为此对象监视器的所有者。常见的场景便是就是 synchronized 关键字的语句块内部使用这3个方法,如果直接在线程中使用wait()、notify()、notifyAll()方法,那么会抛出异常IllegalMonitorStateException,抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。。
调用wait()方法的线程,再调用该线程的interrupt()方法,则会重新尝试获取对象锁。只有当获取到对象锁,才开始抛出相应的异常,否则执行该线程之后的程序。
interrupt()方法的工作仅仅是改变中断状态,并不是直接中断正在运行的线程。中断的真正原理是当线程被Objectwait(),Threadjoin()或sleep()方法阻塞时,调用interrupt()方法后改变中断状态,而wait/join/sleep这些方法内部会不断地检查线程的中断状态值,当发现中断状态值改变时则抛出InterruptedException异常;对于没有阻塞的线程,调用interrupt()方法是没有任何作用。
yield()方法使当前线程出让CPU执行时间,但并不会释放当前线程所持有的锁。执行完yield()方法后,线程从Running状态转变为Runnable状态,既然是Runnable状态,那么也很可能马上会被CPU调度再次进入Running状态。
synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白。
Java的synchronized使用方法总结
1. 把synchronized当作函数修饰符时
这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。
同步块,示例代码如下:
public void method3(SomeObject so)
{
synchronized(so)
{
//…
}
}
这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁。
3.将synchronized作用于static 函数,示例代码如下:
Class Foo
{
public synchronized static void methodAAA() // 同步的static 函数
{
//…
}
public void methodBBB()
{
synchronized(Fooclass) // class literal(类名称字面常量)
}
}
代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。
第一种用法就是你上面展示的方法,另一种方法是
synchronized(obj){//obj代表同步的时候要锁住独占的对象
//要同步的部分代码
}
synchronized void getName(){
//代码
}
等价于
void getName(){
synchronized(this){
//代码
}
}
所以后一种方法使用范围更广
同步就是如果一个线程使用一个对象的时候不允许另一个线程来用,就要把那个对象锁起来
通俗点讲,一个人用电话亭时把电话亭锁起来,其他人只能排队使用电话亭,这就是同步,不同步的话就会出现每个人冲上去抢电话亭用的状况
同步使用有两个关键的条件:一个是多线程,另一个是出现多线程共同调用一个对象的状况
以上就是关于wait、notify、sleep、interrupt对比分析全部的内容,包括:wait、notify、sleep、interrupt对比分析、关于JAVA中的synchronized锁定对象、java synchronized 有两种用法一种是方法上加synchronized ,还有一种是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)