• 多线程开发关键技术点


    1.sleep和wait有什么区别?
    相同点:暂停线程执行;
    区别:
    wait方法是Object类的方法,这意味着所有的Java类都可以调用该方法。sleep方法是Thread类的静态方法。
    wait是在当前线程持有wait对象锁的情况下,暂时放弃锁,并让出CPU资源,并积极等待其它线程调用同一对象的notify或者notifyAll方法。
    注意,即使只有一个线程在等待,并且有其它线程调用了notify或者notifyAll方法,等待的线程只是被激活,但是它必须得再次获得锁才能继续往下执行。
    换言之,即使notify被调用,但只要锁没有被释放,原等待线程因为未获得锁仍然无法继续执行。

     注意:wait方法需要释放锁,前提条件是它已经持有锁。所以wait和notify(或者notifyAll)方法都必须被包裹在synchronized语句块中,

    并且synchronized后锁的对象应该与调用wait方法的对象一样。否则抛出IllegalMonitorStateException

    sleep方法告诉操作系统至少指定时间内不需为线程调度器为该线程分配执行时间片,并不释放锁(如果当前已经持有锁)。

    实际上,调用sleep方法时并不要求持有任何锁。

    由于thread 1和thread 2的run方法实现都在同步块中,无论哪个线程先拿到锁,执行sleep时并不释放锁,因此其它线程无法执行。

    直到前面的线程sleep结束并退出同步块(释放锁),另一个线程才得到锁并执行。

    注意:sleep方法并不需要持有任何形式的锁,也就不需要包裹在synchronized中。

  • 相关阅读:
    前端学PHP之语句
    前端学PHP之运算符
    ASP.NET MVC的TextBoxFor()和TextBox()
    在_Layout模版中使用@Styles.Render()没有效果
    使用HTML.ActionLink实现一个图片链接
    微软最有价值专家大中华峰会花絮视频
    激活当前视图菜单高亮呈现
    获取当前视图名
    Razor语法中链接的一些方法
    Razor语法的一些特殊需求输出
  • 原文地址:https://www.cnblogs.com/ccEmma/p/8609183.html
Copyright © 2020-2023  润新知