起航学习网

- 让每个人都能学到最前沿新知识、新技能!
起航学习网
当前位置: 起航学习网 > 短期培训 > 编程语言 > 实现Java锁的两种机制

实现Java锁的两种机制

时间:2022-08-14 14:43:23来源:零基础学Java 作者:Java学习网 已有: 名学员访问该课程

  快捷搜索:java锁的两种机制

前言: java多线程编程环境下并发是常见问题,这两天看了锁相关的问题,记录下两个简单的用锁实现等待/唤醒机制的demo。

java多线程编程环境下并发是常见问题,这两天看了锁相关的问题,记录下两个简单的用锁实现等待/唤醒机制的demo。

1.synchronized方式实现等待/唤醒。

public class WaitAndNotify {
    private static boolean flag = true;
    private static Object lock = new Object();
    public static void main(String[] args) {
        Thread waitThread = new Thread(new Wait(), "WaitThread");
        waitThread.start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Thread notifyThread = new Thread(new Notify(), "NotifyThread");
        notifyThread.start();
    }
    private static class Wait implements Runnable {
        @Override
        public void run() {
            synchronized (lock) {
                while (flag) {
                    System.out.println(Thread.currentThread() + " flag是true,wait。。" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread() + " flag是false,开始继续工作" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
            }
        }
    }
    private static class Notify implements Runnable {
        @Override
        public void run() {
            synchronized (lock){
                System.out.println(Thread.currentThread() + " 持有锁,发出通知" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
                lock.notifyAll();
                flag = false;
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

打印结果:

Thread[WaitThread,5,main] flag是true,wait。。18:55:28
Thread[NotifyThread,5,main] 持有锁,发出通知18:55:29
Thread[WaitThread,5,main] flag是false,开始继续工作18:55:34

分析:根据程序可以看到,大致的过程就是:WaitThread拿到lock对象的锁,然后根据flag标记,自己调用了wait()方法,从而释放锁并进入WAITTING状态。NotifyThread此时获取了lock对象的锁,然后进行notify操作,此时WaitThread被唤醒,但是,它不能立刻执行,因为唤醒线程NotifyThread还持有“该对象的同步锁”。必须等到NotifyThread线程释放了“对象的同步锁”之后,也就是同步代码块执行完以后,即睡眠5秒以后,等待线程WaitThread才能获取到“对象的同步锁”进而继续运行。

2.ReentrantLock方式实现等待/唤醒。

public class ReenterLockCondition {
    private static ReentrantLock lock = new ReentrantLock();
    private static Condition condition = lock.newCondition();
    private static Runnable runnable = () -> {
        try {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + "进入等待。。");
            condition.await();
            System.out.println(Thread.currentThread().getName() + "继续执行");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    };
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(runnable, "thread--1");
        thread.start();
        Thread.sleep(2000);
        lock.lock();
        condition.signal();
        System.out.println("主线程发出信号");
        lock.unlock();
    }
}

打印结果:

thread--1进入等待。。
主线程发出信号
thread--1继续执行

分析:这里thread–1线程是等待线程,主线程就是唤醒想成。开始thread-1启动,拿到锁,然后进入等待并且释放锁,2秒后,主线程拿到锁,然后发出信号并释放锁,最后,thread–1继续执行。

以上就是关于“实现Java锁的两种机制”的介绍,大家如果想了解更多相关知识,不妨来关注一下IT培训网的Java视频教程,里面的课程内容由浅到深,通俗易懂,即使没有基础也可以听懂,希望对大家的学习能够有所帮助。

文章出自:http://qh.itpxw.cn/peixun/software/2022123638.html

文章标题:实现Java锁的两种机制



免责声明:本站文章均由入驻起航学习网的会员所发或者网络转载,所述观点仅代表作者本人,不代表起航学习网立场。如有侵权或者其他问题,请联系举报,必删。侵权投诉

你也许会喜欢如下的文章?
(责任编辑:深圳学历教育网)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
培训学校
IT培训网 访问该机构站点 报名留言 加为好友 用户等级:注册会员 用户级别:10 机构名称:IT培训网 联 系 人:罗老师 联系电话:13783581536 联系手机:13783581536 在线客服:起航学习网客服 在 线 QQ:起航学习网客服 电子邮件: 网站域名:http://www.itpxw.cn 注册时间:2016-07-18 11:07 最后登录:2024-02-20 13:02
推荐内容