🏠个人主页:阿空12138
🧑个人简介:大家好,我是阿空,一个想要与大家共同进步的男人😉
😉目前状况🎉:目前大三,在找工作👏👏
💕欢迎大家:这里是优快云,我总结知识的地方,欢迎来到我的博客😘
前言
今天是周末 七个室友一起去了天坛那块儿玩,我顶级老宅男去教室自习了
文章目录
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 操作竞争锁;
如果锁对象处于重量级锁状态,线程将进入阻塞状态,等待锁的释放
总结
提示:这里对文章进行总结:
以上就是今天要讲的内容