文章目录
Thread
Java中没有 线程.对应的是 OS 中的线程.
synchronized & reentrantlock
sync 对 方法枷锁. 在同一时间只能有一个Thread访问这个方法.
重量级锁
jvm 早期的 sync 是重量级别的锁
早期 jvm 不对锁进行操作. 是OS 管理 线程和锁
等到 可以返回时返回给 jvm
轻量级锁
jvm 内部 管理 的锁
atomic 使用的就是 轻量级锁,自旋锁
实现
内部方法
1 一个值,刚刚开始的时候是 0
2 一个Thread 将 value + 1,写入到 主存中.
3 这时候进行比较,value 是不是 0. 如果是0的话,则写入主存
4 如果不是 0,value == 1的话,则将 value 再次读取到自己空间. 进行操作
5 最后重复上面的步骤. 进行操作
这种方式 就可以叫做自旋锁,也可以叫做无锁
问题
1 会引起 ABA问题
就是 Thead-a 在写入到 主存中,需要查询主存的值是否是0.
如果这时 主存中的值 是 0 1 0. 那么这就是 ABA 问题
1 解决
添加版本号. 可以添加 Bool 或者 时间戳进行解决
2 原子性问题
cas 只能实现 最终xxxx 这里没听着,再听一遍
如果计算机是 多核. 则执行下面的汇编语句
自旋 & 阻塞
一个占用 CPU,一个阻塞
contextSwitch
线程切换
自旋适合 任务短,任务少的场景
阻塞适合 任务多,执行时间长的场景
升级过程
偏向锁
不是锁. 是一种同步的机制
没有锁 竞争. 将 ThreadID 和 资源联系起来.
轻量级锁
1 一开始的时候,使用自旋的方式. 等待
2
在Thread多的情况下,就将 Thread 及 锁交给 OS 管理
在之前任务时间长的情况下,升级重量级锁
我们可以在指定自旋多少圈的情况下 升级重量级别的锁