1.锁的策略
1.1锁的策略是什么
这个锁的策略可以理解为,一种做法,相当于当你遇到锁竞争,加锁解锁,的情况你会怎么做。
乐观锁可以理解为疫情的时候比较乐观就买了最基本的物资, 买的时候非常方便
1.2乐观锁
当效率冲突比较低的时候就是乐观锁,这个锁就是乐观锁,资源占用率小
1.3悲观锁
当效率冲突较高的时候就是悲观锁,这个锁就是悲观锁,资源占用率高
1.4悲观锁和乐观锁的对比
1.5轻量级锁
轻量级锁就是☞任务比较少,加锁的数量较少,可以大概理解为乐观锁
1.6重量级锁
重量级锁就是☞任务比较多,加锁的数量比较少,可以理解为悲观锁
1.7轻量级锁和重量级锁的对比
1.8synconize锁
这个是Java包中的锁,他是比较只智能的任务少的时候就是乐观锁,任务多的时候就是悲观锁。
1.9自旋锁
一种轻量级锁的实现方式(典型)
类似于你追你女神结果女神有对象然后你一直每天骚扰,然后这时候女神分手了,这时候你就上位了,这时候就是自旋锁的感觉。
代码图片
1.10挂起等待锁
一种重量级锁的实现方式(典型)
类似于你追女神然后女神有对象,这时候你微信把女神拉黑,然后一直默默努力,然后这时候女神分手了,然后你再追求女神,这个中间空白的时间就是(挂起时间)
1.11可重入锁
synchronized就是一个可重入锁它可以一直不断的给一个对象进行加锁,不会发生死锁
1.12不可重入锁
在C++中std:mutex就是一个不可重入锁,针对一格线程加锁两次就会发生死锁。
1.13公平锁
严格按照先来后到的顺序来获取锁,哪个线程的等待时间长就是哪个线程获得锁
1.14非公平锁
各个线程各凭本事,谁拿到锁这个就是谁的。
其中synconize不是公平锁,他是系统随机调度的,要是想公平的化就要使用队列来实现线程的公平拿到锁。
1.15公平锁和非公平锁的相互功能对比
1.16互斥锁
互斥锁相当于拿到这个锁以后如果这个线程再出现一次这个锁就会报错,像synconize就是一个典型的互斥锁
1.17读写锁(JAVA api中读写锁来让我们用)
我画了一格逻辑图来让大家更好的了解到读写锁是什么东西
2.synconize详细讲解
在上面讲了那么多的锁,我们一定好奇在java jdk包中提供的synconize是什么锁这里我就总结一下
synconize其实是一个自适应的锁
它加锁的状态是下面这一张图片
这个偏向锁相当一个标记,如果需要加锁他就会加锁,如果不需要加锁他就一直标记着知道这个线程结束。在下面的图中,升级的过程是不可逆的。未来JVM或许会出一个这样的功能
3.JVM处理锁
3.1synconize锁的优化
(synconize)在编译器中,JVM会自动来判断这个锁是否应该存在,如果需要加锁就保留不需要就直接消除。
4.CAS流程
CAS是compare 和swap进行比较和交换的意思
这是CPU的原子命令
其中JVM把这个CPU的原子指令给封装所以我们可以用这个原子指令,来进行CAS的操作
这个不建议大家用容易出错
这里只是给大家讲解一下
我们还可以用这种封装的方法来替换运算符
其中这些被封装的方法是没有进行加锁的因为加锁的化就会占用CPU占用CPU就会使代码的效率降低。
这些方法只能在一些特定的场景下才能使用