zoukankan      html  css  js  c++  java
  • JAVA-初步认识-第十四章-多线程-wait和sleep的区别

    一.

    wait和sleep的方法有些类似,我们现在要对其进行描述,区分它们。

    wait方法在object类中,而且有两种形式,分别是wait()和wait(long timeout),我们关注后者。

    参数的截图中表明wait方法可以醒。

    等待和睡眠的区别,睡眠是可以醒过来的,但是等待有可能是无休止的。

    两者一个是object方法,一个是thread方法。

    sleep能不醒,不需要被人叫。sleep拿着锁,别人进不来。

    现在讲述一些有趣的,可能颠覆以往的概念。

    这两个是同一个锁,t0,t1,t2三个线程全部冲入show方法,全部都卧倒了。t0拿到锁this,进入同步代码块,就wait了。一wait就等在这儿了,就进入线程池了,接着就释放执行权了,也释放锁了。因为在另外的method方法中,有可能有notify,要不然t4怎么救t0~t2,

    t0一挂,t1,t2,t4就抢执行权了。t1拿到执行权和锁,进来后也wait了,同样的t2也会挂在这。

    现在要说的是这个问题,t4进来,notifyAll,上面的三个线程全都活了。这就有问题,在同步中,某一个时刻只能有一个线程执行,现在有三个在里面活着,怎么办?

    在外面进不来就安全了,现在都进来了,这下面还有共性代码,多条语句,这三个线程一操作就挂了,

    三个线程都活着,都在等待着执行权,cpu如果切换到t0上,这时候t0也不见得就运行。因为这上下的所有线程都在同步当中,在同步当中,你想要运行,得具备一个资格,你得持有锁。t4一个notifyAll,上面三个线程都活了,只能说明它们都具备了资格,但是t4还拿着锁呢?t4还没出来呢,t4从同步中一出来,锁就放了。这一放,上面三个线程就有一个切到执行权上,它就会获得锁。如果t0获得锁了,它就执行,这时t1和t2是不可能执行的,除非t0出去,否则它们执行不了。

    同步里面一个时刻只能有一个线程能够执行,但是活的线程不止一个。谁拿锁谁执行。

  • 相关阅读:
    TYPE_SCROLL_INSENSITIVE is not compatible with CONCUR_UPDATABLE
    with admin option /with grant option
    通过动态SQL语句创建游标
    Vue:在vue-cli中使用Bootstrap
    Vue:$set和$delete
    Vue:如何在vue-cli中创建并引入自定义组件
    MVC教程四:Controller向View传值的几种方式
    Vue:生命周期
    Vue.js常用指令:v-model
    vue:过滤器
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/8097358.html
Copyright © 2011-2022 走看看