Java教程

Java开发知识体系!21年Java面经分享

本文主要是介绍Java开发知识体系!21年Java面经分享,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
# 1 什么是自旋锁和互斥锁? 由于CLH锁是一种自旋锁,那么我们先来看看自旋锁是什么? **自旋锁**说白了也是一种互斥锁,只不过没有抢到锁的线程会一直自旋等待锁的释放,处于**busy-waiting**的状态,此时等待锁的线程不会进入休眠状态,而是一直忙等待浪费CPU周期。**因此自旋锁适用于锁占用时间短的场合。** 这里谈到了自旋锁,那么我们也顺便说下互斥锁。这里的**互斥锁**说的是传统意义的互斥锁,就是多个线程并发竞争锁的时候,没有抢到锁的线程会进入休眠状态即**sleep-waiting**,当锁被释放的时候,处于休眠状态的一个线程会再次获取到锁。缺点就是这一些列过程需要线程切换,需要执行很多CPU指令,同样需要时间。如果CPU执行线程切换的时间比锁占用的时间还长,那么可能还不如使用自旋锁。**因此互斥锁适用于锁占用时间长的场合。** # 2 什么是CLH锁? **CLH锁**其实就是一种是基于逻辑队列非线程饥饿的一种自旋公平锁,由于是 Craig、Landin 和 Hagersten三位大佬的发明,因此命名为CLH锁。 **CLH锁原理如下:** 1. 首先有一个尾节点指针,通过这个尾结点指针来构建等待线程的逻辑队列,因此能确保线程线程先到先服务的公平性,因此尾指针可以说是构建逻辑队列的桥梁;此外这个尾节点指针是原子引用类型,避免了多线程并发操作的线程安全性问题; 2. 通过等待锁的每个线程在自己的某个变量上自旋等待,这个变量将由前一个线程写入。由于某个线程获取锁操作时总是通过尾节点指针获取到前一线程写入的变量,而尾节点指针又是原子引用类型,因此确保了这个变量获取出来总是线程安全的。 这么说肯定很抽象,有些小伙伴可能不理解,没关系,我们心中可以有个概念即可,后面我们会一步一图来彻彻底底把CLH锁弄明白。 # 3 为什么要学习CLH锁? 好了,前面我们对CLH锁有了一个概念后,那么我们为什么要学习CLH锁呢? 研究过AQS源码的小伙伴们应该知道,AQS是JUC的核心,而CLH锁又是AQS的基础,说核心也不为过,因为AQS就是用了变种的CLH锁。如果要学好Java并发编程,那么必定要学好JUC;学好JUC,必定要先学好AQS;学好AQS,那么必定先学好CLH。因此,这就是我们为什么要学习CLH锁的原因。 ## 总结 面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。 此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷! 给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等” ![image](http://www.www.zyiz.net/i/li/?n=2&i=images/20210704/1625386109516209.jpg) > **[资料领取方式:点击这里免费下载](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)** 且除了单纯的刷题,也得需准备一本【JAVA进阶核心知识手册】:JVM、JAVA集合、JAVA多线程并发、JAVA基础、Spring 原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB、Cassandra、设计模式、负载均衡、数据库、一致性算法、JAVA算法、数据结构、加密算法、分布式缓存、Hadoop、Spark、Storm、YARN、机器学习、云计算,用来查漏补缺最好不过。 ![image](http://www.www.zyiz.net/i/li/?n=2&i=images/20210704/1625386109507971.jpg)
这篇关于Java开发知识体系!21年Java面经分享的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!