美文网首页
等待通知-01

等待通知-01

作者: Spring_java | 来源:发表于2019-08-10 14:54 被阅读0次

最近准备面试,写了下几个简单小程序,无聊写到博客上。

代码如下:

    public static void main(String[] args) {
        List<String> list = new ArrayList<>(1);
        Object lock = new Object();
        Thread get = new Thread(new Runnable() {
            @Override
            public void run() {

                while (true) {
                    synchronized (lock) {
                        while (list.size() == 0) {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        list.remove(0);
                        System.out.println(Thread.currentThread().getName() + " 消费,总量为++++" + list.size());
                        lock.notify();
                    }
                }
            }
        }, "get");

        Thread put = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    synchronized (lock) {
                        while (list.size() != 0) {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        list.add("产品");
                        System.out.println(Thread.currentThread().getName() + " 生产,总量为--》" + list.size());
                        lock.notify();
                    }
                }
            }
        }, "put");
        get.start();
        put.start();
    }

就是一个简单的单生产和单消费的代码。

有几个点,提醒自己注意下:

1: SYNCHRONIZED

这个关键字的含义是: 当代码进入到它所限定的范围内时,不执行完毕,CPU是不会切换走的,除非自己主动放弃锁,,例如图上的 wait方法。

2:wait 和Notify 关键字

  • wait方法是:等待,但是释放锁
  • notify 方法: 就是唤醒等待的锁,但是此时唤醒 等待的锁后,等待的锁并不是立刻就获取了锁。
    还是要唤醒锁的线程执行完它所在线程的synchronized的限定范围,这样被唤醒的才会尝试去唤醒锁。

3:唤醒之后

                synchronized (lock) {     1
                        while (list.size() == 0) {
                            try {
                                lock.wait();     2
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        list.remove(0);
                        System.out.println(Thread.currentThread().getName() + " 消费,总量为++++" + list.size());
                        lock.notify();
                    }

在图上的2处,释放锁完毕后,当被其他线程唤醒后,并且CPU切换到当前这个线程的时候,

不是再从1开始去尝试获取锁,而是直接在代码2处,尝试获取锁,如果还不成功,就再次进入阻塞状态

相关文章

  • 等待通知-01

    最近准备面试,写了下几个简单小程序,无聊写到博客上。 代码如下: 就是一个简单的单生产和单消费的代码。 有几个点,...

  • 等待通知

    高考过去一段时间了,现在身边一本的同学们已经知道学校。我还在等结果。报志愿那几天,真的,苦思冥想,自己翻来覆去,...

  • 等待通知

    江苏省480的总分,407就能上北大。只需要84.75% 加油,状元们。

  • 等待通知

    等待通知 文/严章强 在这个春花烂漫的季节里 本早该在学校上课的你们 因这场新冠病毒肺炎 影响了你们上学 封城防控...

  • 等待通知

    因为突发的疫情,原来通知的5月5日至10日居家办公,明天是否放开,能否正常去公司上班还是未知数。 从昨天的核酸检测...

  • 等待/通知机制

    等待/通知机制 场景 吃饭 : 一家人要吃午饭,妈妈做饭,我和爸爸吃饭。让我和爸爸的坐在桌子旁准备吃饭。但是我和爸...

  • Condition等待通知

    如果你知道经典的生产消费模式(wait,notify实现),那么这篇文章你应该能够轻松地阅读理解。Conditio...

  • 等待&通知机制

    等待/通知机制 什么是等待/通知机制? 举例说明,厨师和服务员之间的交互: 厨师做完一道菜的时间不确定,所以厨师将...

  • 等待/通知机制

    原文地址:https://hexige.github.io/blog/2017/09/25/%E7%AD%89%E...

  • 等待和通知

    等待和通知 API java.lang.Object 类提供了一套等待/通知的 API,它由 3 个 wait()...

网友评论

      本文标题:等待通知-01

      本文链接:https://www.haomeiwen.com/subject/sgdrjctx.html