wait() sleep() synchronized()

两种wait()方法

 **带参数的wait()方法

第一种需要一个以毫秒计的时间作参数,它的意思和sleep()一样,都是:“暂停一段时间”区别在于:

1.wait()会释放对象的锁,也就是说在线程wait()期间,别的线程可以调用它的synchronized方法。

 线程sleep()的时候,不会释放对象的锁。当对wait中的线程调用interrupt时,会先重新获取对象的锁,再抛出InterruptedException。获取对象锁定之前,并无法抛出InterruptedException异常。

2.除了时间到,wait()还可以用notify()或notifyAll()中止.

 **不带参数的wait()方法

第二种wait()不需要任何参数,它的用途更广.线程调用了这种wait()之后,会一直等下去,直到有别的线程调用了这个对象notify()或notifyAll().

** wait()方法被notify之后需要重新排队

wait()方法的使用

 

使用wait()方法时,线程便进入waitset,假设现在已经执行一个如下的语句:

obj.wait();

则目前的线程会暂时停止执行,进入实例obj的waitset。这个操作称为:线程在obj上wait。

如果实例方法含有如下的语句时:

wait();

则其意义同:

this.wait();

故执行wait()的线程就会进入this的waitset。此时,就变成了线程在this上wait。

 *** 我的理解是:一个实例对象只有一个锁

和sleep()属于Thread类的方法不同,wait()、notify()和notifyAll()是根object的方法。虽然这种做法(把专为多线程服务的方法放到通用的根类里面)看上去有些奇怪,但却是必要的。因为它们所操控的是每个对象都会有的锁。所以结论就是,你只能在synchronized方法或synchronized段里调用wait(),notify(),notifyAll(),否则程序运行时会抛出IllegalMonitorStateException。这个异常带着一个挺让人费解的“currentthread notowner”消息。这个消息的意思是,如果线程调用对象的wait(),notify(),notifyAll(),必须先拥有这个对象的锁。

调用notify()、notifyAll()方法后,被唤醒的唯一一个线程执行的第一条语句,是紧跟在wait()方法后面的语句。

 

synchronized方法

 

synchronized void f() { }

synchronized void g(){ }

每个对象都有一个锁(也称监控器monitor),它是对象生来就有的东西(因此你不必为此写任何代码)。当你调用synchronized方法时,这个对象就被锁住了。在方法返回并且解锁之前,谁也不能调用同一个对象的其它synchronized方法。

线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。

如果你调用了f( ),那么在f()返回并且解锁之前,你是不能调用同一个对象的g()的只要有实例就会相对有一个锁定,不是说因为某个实例的synchronized方法正在执行中,导致无法执行其他实例的synchronized方法。

synchronized方法和synchronized块,无论碰到return或是异常,都会解除锁定。

要调用synchronized实例方法的线程,一定要先获取this的锁定。一个实例的锁定,同一时间内只能有一个线程可以得到。

如果实例不同,那锁定也不同了。如果有多个相异实例,那多个线程仍然可以分别执行不同实例的synchronized方法。

使用synchronized块的时候,特别需要考虑“获取谁的锁定来保护”的情况。因为synchronized块需要明确的指出要获取的是哪个对象的锁定。例如:

synchronized (obj){

………….

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值