锁:解决线程并发数据不一致的问题
synchronized: 多个线程序列化执行
信号量
一个object占多少个字节:16个字节
一个java对象包含四个部分
前两个:对象头
对齐存在的意义:方便整理

synchronized关键字:就是给对象头markword上做了个标记
markword三个作用:

解决数据不一致的另外一种解决方案:CAS 自旋锁
compareAndSwap
自带原子属性:不会被打断

自旋锁

往回写做一次比较,相同则写入,不同则读出继续做相同操作,直到一次成功。
其他线程修改数次最后值和原值相同。
也可以是指向问题。
如何解决:加一个版本号
如果判断没被修改后后,然后被别的线程修改了
cas本身就要具备原子性

lock底层实现方式: 关中断,锁总线等

轻量级: CAS 转圈等
重量级:排队等
java起一个线程,os就会起一个线程 1比1线程。
go是1对多。
jvm解决不了的问题,扔给os操作系统去解决,这就叫重量级锁
轻量级:jvm自己就解决了; whlie循环消耗cpu资源,
重量级:交给os去解决,线程进入等待队列; 不需要消耗cpu资源
为什么要有重量级?
线程多少决定, 轻度竞争用轻量级,重度竞争用重量级。

轻量级什么时候升级为重量级锁?
考的少了。
睡了5秒后,再上锁


偏向锁就是一个标记
将第一个线程id放在 锁的markword上。
减少锁竞争,只有一个线程的时候(第一个线程),不启动锁机制,使用锁标记
所有用到锁的地方百分之八九十的地方只有一个线程。
有了其他线程,就进行了锁升级
如果明确知道环境一定是多线程的,没有必要启动偏向锁。
jvm启动的时候,一堆的线程要启动,一开始没有必要启动偏向锁,默认4秒后启动。
对象在内存中的存储布局
32位,64位机器值得是指针长度,寻址空间
2的32位, 4G, 内存最大只能4个G
jvm64位虚拟机的 class pointer指针为4字节,默认启动压缩
项目驱动
从脉络到细节