关于如何让线程主动让出CPU和如何让线程主动放弃锁
博客专区 > Hosee 的博客 > 博客详情
关于如何让线程主动让出CPU和如何让线程主动放弃锁
Hosee 发表于2年前
关于如何让线程主动让出CPU和如何让线程主动放弃锁
  • 发表于 2年前
  • 阅读 1380
  • 收藏 5
  • 点赞 2
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 本文主要探讨如何让线程主动让出CPU和如何让线程主动放弃锁

刚刚突然想到

如何让线程主动让出CPU?

如何让线程主动放弃持有的锁?

想了下,有点模糊,记录一下方便回忆。

如何让线程主动让出CPU

Thread.sleep();

sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。

在多线程争用的情况,拥有锁的线程进行一些耗时操作,会极大降低吞吐量(amdahl定律),如果在同步块中使用sleep就是一种糟糕的做法,它不会释放锁却阻止其他线程获得锁。

Thread.yield();

yeild是个native静态方法,这个方法是想把自己占有的cpu时间释放掉,然后和其他线程一起竞争(注意yeild的线程还是有可能争夺到cpu,注意与sleep区别)。在javadoc中也说明了,yeild是个基本不会用到的方法,一般在debug和test中使用。

Object.wait();

wait会把当前的锁释放掉同时阻塞住,让出CPU;当别的线程调用该 Object 的 notify/notifyAll 之后,有可能得到 CPU,同时重新获得锁。

当然同样的

condition.await();

也会释放锁并且让出CPU;

当然很多竞争锁失败的线程最终也会阻塞住,但是这不是主动让出CPU,不在讨论范围内。

Thread.stop();

太过暴力,不推荐使用,同时会释放所有锁。容易导致数据不一致,具体请查看[高并发Java 二] 多线程基础

Thread.currentThread().suspend();

挂起线程,suspend不会释放锁,suspend容易发生死锁,不推荐使用。原因请查看[高并发Java 二] 多线程基础

LockSupport.park();

与suspend一样挂起线程,但是park/unpark不会发生死锁,原因请查看[高并发Java 五] JDK并发包1

Java中Thread的状态有:

NEW

RUNNABLE

WAITING:Object.wait(),LockSupport.park()

TIMED_WAITING:Thread.sleep(long),Object.wait(long),LockSupport.parkNanos(long)

BLOCKED:Object.wait()

TERMINATED:Thread.stop()

如何让线程主动放弃持有的锁

Object.wait();
condition.await();
Thread.stop();

上面已经说了

当然所有释放锁的操作都可以:

reentrantLock.unlock();
semaphore.release();

要注意的是以下操作不会释放锁,在上面已经谈到了,这里再列举以下:

Thread.sleep();
Thread.yield();
Thread.currentThread().suspend();
LockSupport.park();

Reference:

1. http://www.lai18.com/content/2571817.html

2. https://www.zhihu.com/question/23328075

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 496
博文 132
码字总数 207228
×
Hosee
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: