Java后端
·2025-04-15复习第七天
说说 AQS 吧?
抽象队列同步器,定义了一系列规范,是其他同步器的基础
核心:volatile修饰的state变量,等待队列、条件队列
state变量:独占锁的时候1表示被占由,0表示空闲
等待队列(CLH):非公平锁的情况下,先抢占锁,如果强不到,则通过CAS自旋,如果还是没抢到,则进入等待队列中
为什么使用CLH队列?
自旋锁:多个线程CAS一个变量,可能造成总线风暴
CLH:对自旋锁的改进,多个线程组成一个隐式队列,每个线程自旋查看前一个线程的状态,如果上一个线程释放锁了自己则可以获取
AQS实现的CLH:多个线程组成一个双向队列,只有队头的是在运行,其他的都是阻塞的,当队头的释放锁的时候在通知后一个线程获取锁。
Synchronized 和 ReentrantLock 有什么区别?
Synchronized 基于JDK层面的,适合基本的同步操作,不能实现超时、非公平等操作
ReentrantLock 基于JUC并发包下的,适合复杂的同步操作,可以实现超时、非公平等操作
Synchronized 原理
依赖于监视器和对象头来实现同步操作
修饰方法时:会在方法的访问标志中加上ACC_SYNC标注,当线程访问该方法的时候,会先去获取它的监视器锁,获取到了才能继续执行
修饰代码:在代码的前面加上mnitorenter,具体代码,在代码的后面加上monitorexit来实现同步操作
本质都是获取对象的监视器锁
对象头:
Mark Work:运行时的数据,GC年龄、锁的信息(偏向锁、轻量级锁。)
Class Point:指向类元信息
Synchronized jdk1.6后优化
偏向锁:监视器锁偏向于第一个获取它的线程
轻量级锁:如果获取一个被偏向的锁,则会通过自旋的方式获取
重量级锁:如果自旋失败了,则会继续阻塞操作
锁粗化:多个锁如果和一个锁等效,则会锁粗化
锁消除:通过逃逸分析,如果发现代码不会存在线程安全,则锁消除。
ReentrantLock 原理
是AQS的具体实现之一,可重入锁
核心:volatile修饰的state变量,等待队列、条件队列
state变量:独占锁的时候1表示被占由,0表示空闲
等待队列:非公平锁的情况下,先抢占锁,如果强不到,则通过CAS自旋,如果还是没抢到,则进入等待队列中
条件队列:如果不满足条件调用Condition.wait()继续等待,需要其他线程调用Condition.signal()进行唤醒,或者设置超时等待
Java 中 volatile 关键字的作用是什么?
保证被修饰变量的可见性和禁止指令重排序
可见性:强制线程读取volatile修饰的变量的时候不从工作内存中读取,而是直接去主内存中读取
禁止指令重排序:通过插入内存屏障的方式来禁止指令重排序,比如,读屏障:当读取volatile修饰的变量的时候,会在其前面插入读屏障,防止前面的指令重排到屏障后面去,写屏障:写volatile修饰的变量的时候,会在其后面插入写屏障,防止后面的指令重排到屏障前面去
用途:
双重检查锁定
从网络角度来看,用户从输入网址到网页显示,期间发生了什么?
URL解析:解析URL封装成HTTP报文
DNS域名解析:将域名转化为对应的IP地址
TCP/UDP:将报文加上TCP头,为不同主机间的应用程序提供服务
IP:给报文再加上IP头,用于不用网络之间传输
MAC:继续加上MAC头,用于相邻节点之间的传输
网卡:将二进制转化为电信号通过网线进行传输
交换机:取下MAC头上的目标MAC地址和原MAC地址,根据交互机上的交换表选择端口进行传输,如果不存在则通过广播的形式找到端口
路由器:取下IP头上的目标IP地址,根据路由器上的路由表选择对应的网络进行传输
层层验证:最终到达服务器,服务器层层校验MAC、IP、根据TCP报上的端口找到主机上的应用程序
处理请求:应用程序处理具体的请求
返回相应:处理完成之后返回相应
前端进行渲染:
交换机:交换表,通过广播的形式进行更新
路由器:路由表,有内部网关协议OSPF(基于成本计算迪杰斯特拉单源最短路径),RIP(基于跳数),外部网关协议:BGP进行更新
DNS域名解析:
递归:查看本地缓存、浏览器、操作系统缓存看看是否有,如果没有客户端再去本地DNS服务器中招,如果没有本地去找顶级域名服务器,没有去找根域名,最后去找权威域名服务器
迭代:由客户端分别去问本地(得到根域名DNS)、根域名(得到顶级DNS)、顶级(得到权威DNS)
Cookie、Session、Token 之间有什么区别?
Cookie:存储在浏览器用户信息,适合存储不敏感的信息,比如个性化设置等
Session:存储在服务器的用户信息,安全性比较高,将session_id存储在cookie
Token:一串加密的字符串,存储在客户端,每次客户端都带上这一串信息和用户信息,到服务器中去验证,可以跨平台使用。
TCP/IP 四层模型是什么?
应用层:为应用程序提供服务,比如HTTP,DNS,FTP
传输层:为不同主机上的应用程序提供服务,TCP、IP
网络层:为不同主机的网络通信提供服务,IP
网络链路层:为相邻的节点提供服务,以太网,PPP
为什么分层?
1、不同层之间的作用不同,层与层之间各司其职,
2、相互隔离又相互联调
TCP/IP四层模型和OSI七层模型有什么区别?
OSI七层模型是一个理论层面的,但实现起来比较复杂,有很多层其实可以合并起来,所以市面上主要还是TCP/IP四层模型
数据库的脏读、不可重复读和幻读分别是什么? easy
脏读:在一个事务中,读取到未提交的数据
不可重复读:在一个事务中,多次读取一个数据,产生的结果是不一样的
幻读:在一个事务中,同一条查询语句,多次查询可能返回不同的结果集
MySQL 默认的事务隔离级别是什么?为什么选择这个级别?
默认的隔离级别是可重复读
主要是为了避免早期的binlog的statement格式进行主从复制的时候产生的数据不一致的问题(向前兼容)
在读已提交隔离级别下:现在有两个事务先后执行,事务1执行删除where a = 1操作后提交、事务2执行插入where a = 1操作先提交,此时主库中会存在where a = 1 这一条数据(因为事务1的删除操作是事务1的ReadView视图下执行的),在通过binlog去回放的时候却不会存在where a = 1者一条数据,因为binlog先记录的是插入,后记录的是删除操作
在可重复读隔离级别下:因为有行锁和临建锁,所以事务1已执行删除操作后,事务2是不能执行插入的。要等到事务1已经提交了才行。
MySQL 中的事务隔离级别有哪些? easy
读未提交:可以读到为提交的数据,产生脏读
读已提交:只能读取到已经提交的数据,但是不可以重复读
可重复读:可以重复读取,但是会产生幻读
串行化:事务与事务之间串行执行,此时不会出现幻读
读已提交:事务中每次select的时候都会产生一个ReadView视图
可重复读:事务中只有第一次select的时候会产生一个ReadView视图
3
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
