自旋锁(属于乐观锁)
为了不放弃cpu执行事件,循环的使用cas技术(在更改值时先再次获取值看值是否与刚才获取的相同,不相同说明被其他线程改变,则不进行操作,进行while循环,直到相同为止,再对值进行操作)对数据尝试进行更新,直到成功。
悲观锁
假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁。
乐观锁
假定没有冲突,在修改数据时,如果发现数据和之前获取的不一样,则读最新数据,重试后修改
独享锁(写)
给资源加上写锁,线程可以修改资源,其他线程不能再加锁;(单写)
共享锁(读)
给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁;(多读)
可重入锁
线程拿到一把锁之后,可以自由进入同一把锁所同步的其他代码,比如一个方法中的synchronized块中再次调用该方法,再次进入synchronized块,lock也是如此,同一个线程lock获取锁后,可以再次获取,并且lock提供有获取锁的次数的方法,同时释放时,也要释放相应的次数,多次调用unlock
不可重入锁
与可重入锁相反
公平锁
争抢锁的顺序,如果按先来后到,则为公平
不公平锁
与公平锁相反
关于同步关键字synchronized的相关知识点
同步关键字,优化内容:
偏向锁(减少在无竞争情况,JVM资源消耗)
出现两个及以上的线程争取->轻量级锁(CAS修改状态)
线程CAS自旋一定次数之后,为了避免过多自旋造成性能影响->重量级锁(
对象的mark word 内部会保存一个监视器锁的一个地址,然后每个对象对应一个监视器对象,用到重量级锁的时候对象监视器就起作用了)
对象mark word里面 包含四种状态tag( 00 01 10 11 )
01 无锁
00 轻量锁
10 重量锁
11 GC废弃
扫描二维码关注公众号,回复:
8560411 查看本文章