**公平锁和非公平锁:** 公平锁是队列的,按顺序,非公平锁抢到就占用锁,可插队。非公平锁吞吐量比公平锁大,但是可能会出现饥饿想象(某个线程一直都拿不到锁) synchronized 和 ReentrantLock 默认都是非公平锁
**可重入锁(递归锁)** 访问的同步代码中还有同步代码,这时候内层的代码块可直接进入,使用的和外层是同一把锁。synchronized 和 ReentrantLock 是可重入锁。可防止死锁
**自旋锁:** 采用循环的方式去尝试获取锁(CAS)。优点 不会立即阻塞而且减少线程上下文切换的消耗 缺点 循环会消耗CPU,如果一直失败,对CPU影响大
**独占锁(写锁) / 共享锁(读锁)** 有一个线程在写,别的线程就没法读或写
**偏向锁** 无竞争时使用,一旦有第二个线程竞争,就会从偏向锁改成轻量级锁
## 1. CAS 原理?
轻量级自旋锁
线程拿到的值和主内存中的值一致, 就将要写入的值写入到主内存,否则就修改失败。
使用 Java中的sun.misc.Unsafe 类 这个类的方法都是native的,完全依赖于硬件的功能,通过它实现了原子操作。CAS是一条CPU的原子指令,执行是连续的,执行过程中不允许被打断,不会造成数据不一致问题。
## 2. CAS 缺点?
1. 循环时间长开销会很大
1. 如果CAS失败,会一直进行尝试自旋(do while 方式),如果长时间不成功,会一直循环,对cpu影响大。
## 3. ABA问题
1. 简单来说就是 最初拿到的值和最终比较时值一样,但是这期间值实际是修改过的。 T1 T2 俩个线程从主内存中都拿到的变量是A,T1比较慢,T2 把A改成了B,并写入到主内存,又来了个T3,拿到主内存 B并改成A写入到主内存,这时候T1执行完成值改为了1,发现主内存还是A和自己当时拿到的值一致,就将1写入主内存成功。但是实际上主内存的值已经从出现过A=》B=》A的过程。就是一个线程往主内存写入数据时,发现主内存中的值和线程当时拿到的值是相同的,符合CAS的逻辑,但是实际上主内存中的这个值已经修改过多次,只能当这个线程去写入时,刚好和线程当时拿到的值一致。中间过程中值可能已经被改动过了。
## 3. ABA 解决方式?
版本号,修改一次版本号就增加一次。比如 elasticsearch 中数据每更新一次,版本号字段就加一
## 4. 什么是偏向锁?
在对象头中记录线程id,如果下次来的还是这个线程则直接运行后续代码。
需要启用,JVM 默认延迟 4s 自动启用
## 5. 什么是synchronized ?
是Java中的关键字:用来修饰方法、对象实例。属于独占锁、悲观锁、可重入锁、非公平锁。
1. 作用于实例方法时,锁住的是对象的实例(this);
2. 当作用于静态方法时,锁住的是 Class类,相当于类的一个全局锁, 会锁所有调用该方法的线程;
3. synchronized 作用于一个非 NULL的对象实例时,锁住的是所有以该对象为锁的代码块。它有多个队列,当多个线程一起访问某个对象监视器的时候,对象监视器会将这些线程存储在不同的容器中。
## 6. synchronized 加锁原理?
jdk 1.6 之前直接就是重量级锁:通过对象内部的监视器(monitor)实现,依赖于操作系统,线程需要争抢 monitor,抢到的就是加锁成功,没抢到的会放到队列中。涉及到阻塞同步,上下文切换,线程调度,操作系统的内核态和用户态的切换。消耗大,性能差。
jdk1.6 以后对synchronized锁进行了优化
内核态:当进程(线程)需要内核代码执行时,就是处于内核态。其他都是用户态。
## 7. synchronized 锁升级(锁膨胀)?
无锁 => 偏向锁 =》 自旋锁(轻量级锁) =》 重量级锁
当有线程加锁时,会在对象头中记录线程id,如果以后还是这个线程,则可以直接运行后续代码,当2个线程以上争抢加锁时,则直接升级为轻量级锁,CAS进行自旋加锁,当线程加锁竞争激烈,CAS自旋不成功(默认 10 次)则升级为重量级锁。
## 可重入锁如果加了两把,但是只释放了一把会出现什么问题?
程序卡死,线程不能出来,也就是说我们申请了几把锁,就需要释放几把锁。
## 如果只加了一把锁,释放两次会出现什么问题?
会报错,java.lang.IllegalMonitorStateException。
## Lock和synchronized的区别?
1. Lock 需要手动获取锁和释放锁
2. Lock 是一个接口,而 synchronized 是 Java 中的关键字, synchronized 是内置的语言实现。
3. Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,等待的线程会一直等待下去,不能够响应中断。
4. Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,等待的线程会一直等待下去,不能够响应中断。
5. Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,等待的线程会一直等待下去,不能够响应中断。
6. synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁。
- 学习地址
- MySQL
- 查询优化
- SQL优化
- 关于or、in、not in、!=等走不走索引的说明
- 千万级数据查询优化
- MySQL 深度分页问题
- 嵌套循环 Block Nested Loop 导致索引查询慢
- MySQL增加日志统计表优化各种日志表的统计功能
- MySQL单机读写QPS(性能)优化
- sqlMode 置 select 的值可以比 group 里的多
- drop、delete、truncate的区别
- 尚硅谷MySQL数据库高级学习笔记
- MySQL架构
- 事务部分
- MySQL知识点
- mysql索引
- Linux docker安装 mysql 8.0.25
- docker 安装mysql 5.7
- mysql Field ‘xxx’ doesn’t have a default value
- mysql多实例
- docker中的sql文件导入
- mysql进阶知识
- mysql字符集
- 连接的原理
- redo日志
- InnoDB存储引擎
- InnoDB的数据存储结构
- B+树索引
- 文件系统-表空间
- Buffer Pool
- 亿级数据导入到es
- MySQL数据复制
- MySQL缺少主键的表数据
- mysql update 其中更新的字段根据另一个更新字段作为条件去更新
- MySQL指定字段值排序(将指定值排在前面)
- 设置MySQL连接数、时区
- Navicat15右键删除数据刷新就又恢复了
- MySQL替换字段部分内容
- Java和MySQL统计本周本月本季和年
- 分页时order by 排序数据重复,丢失
- mysql同一张表根据某个字段删除重复数据
- mysqldump定时全量热备
- 专题总结
- 事务
- MySQL事务
- spring事务
- spring事务本类调用
- spring事务传播行为
- spring事务失效问题
- 锁和Transactional注解一块使用的问题
- 数据安全
- 敏感数据
- SQL注入
- 数据源
- XSS
- 接口设计
- 缓存设计
- 限流
- 自定义注解实现根据用户做QPS限流
- 架构
- 高可用
- Java
- Unsatisfied dependency expressed through field ‘baseMapper‘
- mybatisplus多数据源
- 单个字母前缀的java变量
- spring
- spring循环依赖解决
- 事务@Transactional
- yml 文件配置信息绑定到java工具类的静态变量上
- @Configuration @Component 区别
- springboot启动yml文件报错
- spring方法重试注解Retryable
- spring读取yml集合数据
- spring自定义注解
- 获取resource下的图片资源
- 手机号和电话号的正则验证
- 获取字符串中的数字
- mybatis
- mybatis多参数添加数据并返回主键
- 统一异常处理
- 分组校验
- Java读取Python json.dumps 函数保存的redis数据
- springboot整合springCache
- 若依mybatis值为null的字段没有返回
- 若依
- 接口白名单
- @JsonFormat时区问题
- RequestParam.value() was empty on parameter 0
- jdk8和hutool请求第三方的https报错
- springMVC
- springMVC与vue使用post传数组
- elementUI 时间组件报错问题
- vue具名插槽slot
- springboot配置maven的profiles(配置微服务多环境切换打包)
- resources 配置文件读取顺序
- Windows的cmd部署jar注意事项
- Java基础
- JUC(锁-并发-线程池)
- CAS
- Java 锁简介
- synchronized和Logk有什么区别?用新的ock有什么好处
- synchronized锁介绍
- CompletableFuture
- 多线程
- 线程池
- 集合类
- map见过的小问题
- 退出双层循环
- StringBuilder和StringBuffer核心区别
- 日志打印
- 打印log日志
- log日志文件生成配置
- 日期时间
- 时间戳转为时间
- 并发工具
- 连接池
- http调用
- 内网访问天地图
- 判等问题
- 数值计算
- null问题
- 异常处理
- 文件IO
- 序列化
- 内存溢出OOM
- 子线程的错误, 全局异常处理捕获不到
- vue同一个项目访问多个不同ip地址接口
- Autowired注解导入为null
- shiro
- UnavailableSecurityManagerException错误
- Windows服务器80端口被占用
- java图片增加水印
- springcloud
- Feign方法配置错误导致jar包启动失败
- feign调用超时
- 定时任务quartz
- JavaPOI导出Excel
- 合并行和列
- 设置样式
- 设置背景色
- docker
- Linux 安装
- docker命令
- docker网络
- docker数据卷
- dockerfile
- docker安装ping命令
- docker-compose
- docker-compose文件内容介绍
- Linux关闭docker开机启动
- jar打包为镜像
- 迁移docker容器存储位置
- Nginx
- Linux在线安装Nginx
- nginx.conf 核心配置文件
- vue 和 nginx 刷新页面会报404
- nginx 转发给三个集群的tomcat
- ServerName匹配规则
- Nginx负载均衡策略
- location 匹配规则
- Nginx 搭建前端调用后台接口的集群
- alias与root
- nginx 拦截 post 请求, 带参数转发到前端页面
- 防盗链配置
- Nginx的缓存
- 通用Nginx配置
- nginx配置文件服务器
- 后台jar包得不到正确ip,nginx代理时要处理
- 升级使用websocket协议
- 设置IP黑/白名单
- Redis
- 缓存数据一致性
- 内存淘汰策略
- Redis数据类型
- gmt6
- Linux安装GMT6
- GMT6配置中文
- GMT文件修改Windows版本到Linux版本
- 注意GMT不同字体导致符号不同的问题
- GMT绘制南海诸岛小图
- GMT生成中文图例
- elasticsearch
- 安装配置
- Linux安装配置elasticsearch7.6.2
- Linux 安装 kibana 7.6.2
- 安装7.6.2中文分词器
- docker 安装elasticsearch7.6.2
- 安装Logback7.6.2
- springboot使用
- 0. elasticsearch账号密码模式访问
- 1. 配置连接
- 2. 索引
- 3. 批量保存更新
- Result window is too large 10000
- elasticsearch 分词的字段做排序 fielddata, 设置fielddata=true 无效果
- elasticsearch 完全匹配查询(精确查询)
- 模糊搜索
- 日期区间查询
- 6.x基础知识
- 自定义词库
- elasticsearch集群
- 搜索推荐Suggester
- 查询es保存的数组
- 亿级mysql数据导入到es
- es 报错 ORBIDDEN/12/index read-only
- es核心概念
- es的分布式架构原理
- 优化大数据量时的ES查询性能
- canal
- 1. mysql的Binlog
- 2. Canal 的工作原理
- 3. canal同步es
- JVM
- 1 类的字节码
- 2. 类的加载
- JVM知识点
- Maven
- 依赖冲突
- xxl-job
- docker 安装配置 xxl-job
- idea
- springboot启动报错命令过长
- services统一启动微服务各模块
- 云服务器安装宝塔面板
- 突然出现启动或者运行特别慢
- 有导入依赖但是显示红色同时点击进去也有依赖
- Linux
- sh文件执行报错: command not found
- 使用vagrant安装虚拟机
- Linux 开启端口
- 开放端口
- 复制文件夹及其文件到另一个文件夹
- 两个服务器之间映射端口
- TCP协议
- 分层模型
- TCP概述
- 支撑 TCP 协议的基石 —— 首部字段
- 数据包大小对网络的影响 —— MTU 与 MSS 的奥秘
- 端口号
- 三次握手
- TCP 自连接
- 四次挥手
- TCP 头部时间戳
- 分布式
- 分布式脑裂问题
- 分布式事务
- 基础知识
- 实现分布式事务的方案
- 阿里分布式事务中间件seata
- 幂等性问题
- 其他工具
- webstorm git提交代码后project目录树不显示
- 消息队列
- 如何保证消费的顺序
- 数据结构
- 漫画算法:小灰的算法之旅