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出去,否则它们执行不了。

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

  • 相关阅读:
    Educational Codeforces Round 67 D. Subarray Sorting
    2019 Multi-University Training Contest 5
    Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code
    Educational Codeforces Round 69 D. Yet Another Subarray Problem
    2019牛客暑期多校训练第六场
    Educational Codeforces Round 68 E. Count The Rectangles
    2019牛客多校第五场题解
    2019 Multi-University Training Contest 3
    2019 Multi-University Training Contest 2
    [模板] 三维偏序
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/8097358.html
Copyright © 2011-2022 走看看