实战篇二

关于线程学习中我们接触到的这些方法,我们在使用时需要根据不同情况区分使用。在这里主要来区分下sleep和wait方法,这两个方法有点类似,sleep方法使得当前线程进入睡眠,经过指定的时间后,线程自动变为就绪状态。wait方法,使得当前线程进入等待,直到其他线程调用notify或notifyAll方法时才能唤醒,继续执行后面的程序。二者都能实现当前线程的暂停。
但是,它们之间更多的是区别。sleep方法使得当前线程进入睡眠,如果不被interrupt方法中断,则会睡眠固定的时间,但是,如果是使用在同步块中,线程睡眠期间将继续占有同步锁,直到该线程执行完整个同步块才会释放同步锁,所以,在睡眠的这段时间任何线程都无法方法到这个同步块。这样就造成了程序运行效率的降低,我们应该谨慎使用。
wait方法的使用比sleep稍微复杂一些,因为wait方法需要配合notify/notifyAll来使用,不然只有中断状态方法能够唤醒线程了。但是,wait方法在同步块中的重要性则要远远高于sleep方法,当线程执行了同步块中wait方法后,进入等待,但是,此时线程释放了该同步块的锁,使得别的线程能够有机会访问该同步块。文中向我们介绍了wait方法同样可以实现固定时间的等待,但是可能不够精确,这个无所谓,因为我们基本不会去使用wait来实现这样的功能。
从上面这两段话我们不难看出,sleep和wait方法在使用中的不同,现在我们总结一下。对于非同步块或非同步方法,我们不用考虑同步锁问题,所以sleep就有更多的优势,能够比较精确、简单的完成程序控制工作。而在同步块或同步方法中,我们必须要考虑到程序的效率,所以我们应该尽量使用wait方法,也可以实现类似的程序等待固定时间的效果。
关于虚拟锁这个概念,其实在学习中程老师已经和我们说的比较详细了,还带着我们做了相关的例子,所以这里就简单说下了。
对于同步锁的使用,不同的实现方式将会有非常大的区别。
synchronized关键字:
(1)加在普通方法上,同步方法,锁定的是该类的对象,即一个时刻只能有一个线程使用该对象;
(2)加在静态方法上,同步方法,锁定的是该类本身,即一个时刻只能有一个线程使用该类,与同步对象锁不冲突;
(3)加在方法内部,同步块,synchronized(Object o),即一个时刻只有一个线程能够使用对象o。
虚拟锁主要就是指第三种情况,在参数中我们尽量避免使用this,这样就和前两个一样了,将整个类或实例锁定了。在一个类中,不同的方法可能锁定的是不同的对象,所以使用第三种方法我们可以为这些需要不同锁的方法添加不同的同步锁,这样不同方法之间的使用不会受到干扰,避免了使用不同锁的方法却仍需要争抢一样的同步锁的情况产生。
文中的例子也比较简单,解释的也比较详细,相信大家看了以后应该都能够基本掌握,对于wait和sleep方法,在多线程编程中非常重要,一时很难掌握,所以还需要在实践中多理解。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值