首页 > 试题广场 >

下列哪些操作会使线程释放锁资源?

[不定项选择题]
下列哪些操作会使线程释放锁资源?
  • sleep()
  • wait()
  • join()
  • yield()
join()底层就是调用wait()方法的,wait()释放锁资源,故join也释放锁资源

发表于 2019-07-03 17:49:04 回复(13)

1.sleep()方法

在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。

sleep()使当前线程进入阻塞状态,在指定时间内不会执行。

2.wait()方法

在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。

当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。

唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。

waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

3.yield方法 

暂停当前正在执行的线程对象。

yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

yield()只能使同优先级或更高优先级的线程有执行的机会。 

4.join方法

等待该线程终止。

等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。


发表于 2019-05-23 23:18:52 回复(8)
1.sleep会使当前线程睡眠指定时间,不释放锁
2.yield会使当前线程重回到可执行状态,等待cpu的调度,不释放锁
3.wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
4.当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁
发表于 2019-10-06 23:15:58 回复(6)
我的理解:锁类似厕所的门
1、sleep方法,再厕所里睡着了,不释放锁,能指定时间,然后苏醒
2、yield方法,你在厕所时间太长了,但是你还想蹲,后面的人在催你,于是你与之交涉,不释放锁-->不出厕所,不开门
       若你地位更高,你继续上,地位低, 就走人
3、wait方法,上到一般被催出来了,释放了锁,让后在厕所外等待,直到被通知可以在上了,再继续去厕所上,重新拿到锁
4、join方法,内部使用了wait方法,同上所述

发表于 2021-10-16 13:05:53 回复(3)
thread.wait 是使thread线程等待,释放它占有的锁。
thread.join 是使当前运行的线程等待,释放当前运行的线程的锁,执行thread线程,直到thread线程执行完在执行当前线程。
发表于 2019-06-27 15:01:36 回复(3)
线程执行yield方法,当前线程释放CPU资源,但不会释放锁
发表于 2020-01-20 14:48:41 回复(0)
sleep 让当前线程暂停执行 但不会释放锁
wait 让当前线程等待 会释放锁
join 让当前正在运行的线程等待,并且释放锁,等待调用join的线程执行完毕
yield 让当前线程重新进入就绪状态,同时释放当前线程的锁,执行其他线程操作,
        注意:该操作有可能进入就绪状态后立即再次执行
编辑于 2019-09-03 09:17:39 回复(2)
join()底层就是调用wait()方法的,wait()释放锁资源,故join也释放锁资源 1.sleep会使当前线程睡眠指定时间,不释放锁 2.yield会使当前线程重回到可执行状态,等待cpu的调度,不释放锁 3.wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态 4.当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁
发表于 2022-04-14 08:52:47 回复(0)
这个题其实容易错的也是yield( ),值得注意的是,yield( )仅仅是释放线程所占有的cpu资源,但是却并未释放锁!
发表于 2020-04-23 11:17:09 回复(0)
好家伙  成功避开所有正确答案
发表于 2021-07-15 18:37:29 回复(2)
这道题,感觉错的主要是对yield方法和join方法的的认识,yield记得他是启发式方法,不一定会执行,所以不予考虑join方法内部也是调用了wait方法,所以也会释放锁

sleep方法和wait方法不用讲,区别就在于sleep方法不释放锁,会造成线程阻塞,而wait会释放锁,不会造成线程阻塞.
发表于 2020-02-21 17:40:40 回复(0)
wait会释放锁,join的内部实现也是wait,所以也会释放锁
发表于 2019-08-25 12:38:37 回复(0)
yield()是让线程让步,并没有释放锁
join()是其他线程等待此线程结束完再继续执行,底层调用wait()
发表于 2022-05-31 16:21:47 回复(0)
兄弟们,join会释放内部锁,但是外部锁不会释放。
发表于 2022-04-14 21:30:43 回复(0)
join底层也是wait
发表于 2022-04-11 08:41:19 回复(0)
1.sleep会使当前线程睡眠指定时间,不释放锁
2.yield会使当前线程重回到可执行状态,等待cpu的调度,不释放锁
3.wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
4.当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁
发表于 2021-11-24 23:57:51 回复(0)
发表于 2021-07-19 01:23:33 回复(0)
sleep不释放。 wait释放。是obj方法,对应的notify, yeild优先级,不释放,随时回来, join等待加入,释放。
发表于 2020-08-03 08:28:17 回复(0)
yield() 释放锁再抢回来,就不算释放锁了么
发表于 2019-09-09 14:48:50 回复(0)

1.sleep()方法

在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。

2.wait()方法

在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。

3.yield方法 

暂停当前正在执行的线程对象。

4.join方法

等待调用join方法的线程结束,再继续执行。

发表于 2023-02-19 08:41:25 回复(0)