学习笔记(34):第1章 分布式基础之并发编程-并发编程的挑战 01

立即学习: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标记、偏向锁

猜你喜欢

转载自blog.csdn.net/qq_28500837/article/details/112883924