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

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

在这里插入图片描述

前言

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

文章目录

  • 前言
  • 7月2日 天气晴 24~36℃
  • 总结


7月2日 天气晴 24~36℃

1.每日一道算法题

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

解题思路 典型的拓扑排序

 public int[] findOrder(int numCourses, int[][] prerequisites) {//拓扑排序 0 1 2 3 4 ....n-1HashMap<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]);}elsemap.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 操作竞争锁;
如果锁对象处于重量级锁状态,线程将进入阻塞状态,等待锁的释放

总结

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

以上就是今天要讲的内容


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部