阿空实训日记——永别牢笼计划第四天
🏠个人主页:阿空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 操作竞争锁;
如果锁对象处于重量级锁状态,线程将进入阻塞状态,等待锁的释放
总结
提示:这里对文章进行总结:
以上就是今天要讲的内容
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
