一、内部锁:synchronized关键字
1. 介绍
- Java中的每个对象都有一个与之关联的内部锁(Intrinsic Lock)
- 这种锁也称为监视器(Monitor),这种内部锁是一种排他锁,可以保障原子性、可见性和有序性
- 内部锁是通过synchronized关键字实现的,synchronized关键字可以修饰代码块和方法
① 修饰代码块
② 修饰实例方法也称为同步实例方法
③ 修饰静态方法也称为同步静态方法
2. 同步代码块
- 如果线程的锁不同,不能实现同步
- 想要同步必须使用同一个锁对象
- 常量也可以作为锁对象
3. 同步实例方法
- 把整个方法体作为同步代码块
- 默认的锁对象是this对象
4. 同步静态方法
- 把整个方法体作为同步代码块
- 默认的锁对象是当前类的运行时类对象Class,也有人称为:类锁
5. 同步代码块VS同步方法
- 同步方法,锁的粒度粗,执行效率低
- 同步代码块,锁的粒度细,执行效率高
二、脏读
- 程序在读取属性值时出现了意外,读取的是中间值,而不是修改之后的值
- 产生原因:对共享数据的修改与对共享数据的读取不同步
- 解决方法:不仅对修改数据的代码块进行同步,还要对读取数据的代码块进行同步
三、同步过程中线程出现异常,会自动释放锁对象
四、死锁
- 在多线程程序中,同步时可能需要使用多个锁,如果获得锁的顺序不一致,可能会导致死锁
- 如何避免死锁?
① 当需要获得多个锁时,所有线程获得锁的顺序保持一致即可