阿空实训日记——永别牢笼计划第四天

🏠个人主页:阿空12138
🧑个人简介:大家好,我是阿空,一个想要与大家共同进步的男人😉
😉目前状况🎉:目前大三,在找工作👏👏
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客😘

在这里插入图片描述

前言

今天是周末 七个室友一起去了天坛那块儿玩,我顶级老宅男去教室自习了


7月2日 天气晴 24~36℃

1.每日一道算法题

今天做的是 剑指 Offer II 113. 课程顺序

解题思路 典型的拓扑排序

 public int[] findOrder(int numCourses, int[][] prerequisites) {
         //拓扑排序 0 1 2 3 4 ....n-1

        HashMap<Integer,ArrayList> map =new HashMap<>();
        int[] ints =new int[0];

        int index=0;
        for (int[] prerequisite : prerequisites) {
            ArrayList<Integer> orDefault = map.getOrDefault(prerequisite[0], new ArrayList());
            orDefault.add(prerequisite[1]);
            map.put(prerequisite[0],orDefault);
        }
        Queue<Integer>queue =new ArrayDeque<>();
        for (int i = 0; i < numCourses; i++) {
            if (map.get(i)==null){
                queue.add(i);
            }
        }
        while (!queue.isEmpty()){
           if (ints.length==0) ints= new int[numCourses];
            Integer poll = queue.poll();
            ints[index++]=poll;

            for (int[] prerequisite : prerequisites) {
                ArrayList<Integer> orDefault = map.get(prerequisite[0]);
                if (orDefault==null) continue;
                orDefault.removeIf(item->item.equals(poll));
                if (orDefault.size()==0){ queue.add(prerequisite[0]);
                 map.remove(prerequisite[0]);
                }
                else
                map.put(prerequisite[0],orDefault);
            }


        }

        return index==numCourses? ints:new int[0];

    }

2.每日一道面试题
今天学习到的面试题是

Q:synchronized 底层原理?
A:synchronized 关键字底层原理主要是通过对象头的 Mark Word 和互斥量(互斥锁)来实现线程间的同步。每个 Java 对象的对象头中都包含一个与锁相关的字段,称为 Mark Word。Mark Word 中保存了对象的哈希码、GC 信息以及锁的状态信息等。synchronized 关键字在对象头的 Mark Word 中使用了特定的标志位来表示对象的锁状态。

当一个线程试图获取一个 synchronized 锁时,JVM 会先判断锁对象的 Mark Word 字段,根据其标志位的状态决定采取何种操作:

如果锁对象处于无锁状态,那么 JVM 将会尝试使用 CAS(Compare And Swap)操作来获取锁,将锁的状态由无锁状态转换为偏向锁状态或轻量级锁状态;
如果锁对象处于偏向锁状态,并且持有锁的线程仍然是当前线程,那么 JVM 会将锁的状态保持为偏向锁状态,无需做任何操作;
如果锁对象处于偏向锁状态,但持有锁的线程不是当前线程,JVM 将会尝试使用 CAS 操作将锁对象的状态由偏向锁状态转换为轻量级锁状态;
如果锁对象处于轻量级锁状态,JVM 将会使用 CAS 操作竞争锁;
如果锁对象处于重量级锁状态,线程将进入阻塞状态,等待锁的释放

总结

提示:这里对文章进行总结:

以上就是今天要讲的内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值