多线程续
线程同步机制简介
线程同步机制是一套用于协调线程之间的数据访问的机制,该机制可以保障线程安全
java平台提供的线程同步机制包括锁,volatile关键字,final关键字,static关键字,以及相关的API如Object.wait/Object.notify()等
锁概念
线程安全问题的产生前提是多个线程并发访问共享数据
将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问,锁就是复用这种思路来保障线程安全的
锁可以理解为对共享数据进行保护的一个许可证,对于同一个许可保护的共享数据来说,任何想访问这些共享数据必定持着许可证,就像要进地铁刷地铁码一样,就是说一个锁每次只能进一个人,所以锁具有排他性,当访问了共享数据就释放锁,
jvm把锁分为内部锁和显示锁,内部锁通过synchronized关键字实现,显示锁通过java.concurrent.locks.locks.lock接口的实现类
锁的作用
锁可以实现对共享数据的安全访问,保障线程的原子性,可见性与有序性
锁是通过互斥保障原子性,一个锁只能被一个线程持有,这就是保证临界区的代码一次只能被一个线程执行,使得临界区代码操作自然具有不可分割的特性,具备原子性
可见性的保障是通过线程冲刷处理器的缓存和读线程刷新处理缓存这两个动作实现的在java平台中锁的获得隐含着刷新处理器缓存的动作,锁的释放隐含着刷处理器缓存的动作
锁能够保障有序性,写线程在临界区所执行的在读线程所执行的临界区看来像是完全按照源码顺序执行的,读写都需要相同的锁
锁相关的概念
可重入性
可重入性描述这样一个问题:一个线程持有该锁时能多次申请该锁
如果一个线程持有一个锁的时候还能够继续成功申请该锁称该锁是重入的,否则是不可重入的
锁的争用与调度
java平台中内部锁属于非公平锁,显示lock锁支持公平锁和非公平锁
锁的粒度
一个锁可以保护共享数据的数量的大小称为锁的粒度,如果它保护数据量大,就称粒度粗,会导致申请锁不必要的等待,粒度过细增加锁的开销
内部锁:synchronized关键字
java中的每个对象都有一个与之关联的内部锁,这种锁称为监视器,这种锁是一种排他锁可以保障原子性,可见性,有序性
synchoronized (对象锁){
同步代码块
}
修饰实例方法称为同步实例方法
实例方法的同步区域为方法,如果要使用相同的同步就得是同一个锁对象,锁对象默认为当前实例对象this
修饰静态方法称为同步静态方法
静态方法的同步区域为方法,如果要使用相同的同步就得是同一个锁对象,锁对象默认为当前实例类class为对象
本文地址:https://blog.csdn.net/weixin_43591127/article/details/109611848
上一篇: java面向对象-继承