java中锁的概念

自旋锁(属于乐观锁)

为了不放弃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 查看本文章

在这里插入图片描述

发布了43 篇原创文章 · 获赞 12 · 访问量 4667

猜你喜欢

转载自blog.csdn.net/Jarbein/article/details/102542458
今日推荐