立即学习:https://edu.csdn.net/course/play/29000/405248?utm_source=blogtoedu
1、原子性:线程级别,一系列指令是不可能干预的,一旦开始不能被其他线程或者CPU中断
1.1、原子性常见的验证方法 count++;
这个指令其实可以分解成四步 汇编指令
(1)getstatic 访问一个静态变量获得count原值 例如为3
(2)iconst_1 常量1压入到栈中
(3)iadd 递增 3+1变成4
(4)putstatic 设置静态变量 count指向4,写入主内存
这四步只有不可中断或者分割,这才叫原子性,如果其中一个阶段被中断或者被CPU轮训切换,会导致count++一千次 最终结果不是1000
2、可见性
3、Synchronized
(1) 放在类中的方法上
synchronized void demo(){} 相当于 synchronized(this){}
(2)放在代码块中
void demo(){synchronized(obj){}}
4、syncheonized锁的范围
(1)实例锁
A a=new A();
A b=new A();
两个线程访问 a,那么此时锁是互斥的,因为 是同一个实例 a
两个线程分别访问 a,b,那么此时锁是不互斥的,因为 不是同一个实例
(2)对象锁 :体现在静态方法或者类对象、类锁
静态方法:A中有一个静态方法 静态方法=》synchronized static void demo();等价于 类锁=》 void demo(){synchronized(A.class){}}
两个线程分别访问 a.demo和b.demo,虽然是两个实例a和b,但此时也是互斥的,因为synchronized 修饰的是静态方法或者修饰的是类锁
(3)代码块,体现的是互斥的范围
5、互斥锁的本质:共享资源
6、锁的存储(对象头)
new的一个对象里面,会有一部分空间存储锁的状态和标记
6.1、一个锁对象在内存中的布局为:
(1)对象头:包含 对象标记、类元信息
(2)实例数据
7、锁状态改变=》加锁一定会带来性能开销
JDK1.6以后 锁状态进行了优化变为了 无锁态、轻量级锁、重量级锁、GC标记、偏向锁