前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java - LockSupport学习和使用

Java - LockSupport学习和使用

作者头像
夹胡碰
发布2020-12-29 11:20:24
4000
发布2020-12-29 11:20:24
举报
文章被收录于专栏:程序猿~程序猿~

主要介绍LockSupportparkunpark方法

1. 方法展示

代码语言:javascript
复制
public class LockSupport {
    private LockSupport();
    private static void setBlocker(Thread t, Object arg);
    public static void unpark(Thread thread);
    public static void park(Object blocker);
    public static void parkNanos(Object blocker, long nanos);
    public static void parkUntil(Object blocker, long deadline);
    public static Object getBlocker(Thread t);
    public static void park();
    public static void parkNanos(long nanos);
    public static void parkUntil(long deadline);
    static final int nextSecondarySeed();
}

2. 方法说明

  • park表示当前线程阻塞,等待唤醒,相当于Object的wait方法
  • unpark表示唤醒线程,相当于Object的notify/notifyAll方法

与Object类的wait/notify机制相比,park/unpark有两个优点: 1)以thread为操作对象更符合阻塞线程的直观定义 2)操作更精准,可以准确地唤醒某一个线程(notify随机唤醒一个线程,notifyAll唤醒所有等待的线程),增加了灵活性。 3)park/unpark不用持有锁,将锁和通知模型分离,逻辑更清晰。

另外注意:

  1. 可以先执行unpark,再执行park操作,类似于生产/消费模型。(参考源码中注释 permit 许可含义)
  2. 多次unpark不能叠加,多次unpark只需一次park即可抵消掉。

3. 源码分析

LockSupport底层使用UNSAFE类进行操作,UNSAFE类均是使用native方法。

代码语言:javascript
复制
public class LockSupport {
    ...
    public static void unpark(Thread thread) {
        if (thread != null)
            UNSAFE.unpark(thread);
    }

    public static void park() {
        UNSAFE.park(false, 0L);
    }
    ...
}

4. 使用样例

代码语言:javascript
复制
public class LockSupportTest {

    private static Thread thread = new Thread(new MThread());

    public static void main(String[] args) throws InterruptedException {
        thread.start();
        LockSupport.unpark(thread);
        LockSupport.unpark(thread);
        LockSupport.unpark(thread);
    }

    public static class MThread implements Runnable{

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
                LockSupport.park();
                System.out.println("Thread unpark 1");
                LockSupport.park();
                System.out.println("Thread unpark 2");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 输出
代码语言:javascript
复制
out => Thread unpark 1
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 方法展示
  • 2. 方法说明
  • 3. 源码分析
  • 4. 使用样例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档