java锁

1.synchronized底层原理?
(1)通过java类中的字节码文件就可以看到,只要有synchronized关键字,他就会有一个monitorenter和一个monitorexit指令;
monitor计数器为0,意味着目前还没有被获得,那这个线程就会立刻获得然后把锁计数器+1,一旦+1,别的线程再想获取,就需要等待 如果这个monitor已经拿到了这个锁的所有权,又重入了这把锁,那锁计数器就会累加,变成2,并且随着重入的次数,会一直累加 这把锁已经被别的线程获取了,等待锁释放
Monitor里面有个list存储的是线程队列,owner则记录获取锁的线程信息,如果当前线程执行完成后,队列的其他线程才能获取锁,保证了资源的安全性
(2)一般同步方法是根据ACC_Synchronized标识符,Java虚拟机就是根据这个标识符实现方法的同步Monitor监视器先检查方法是否有该标识符,如果存在执行线程先获取Monitor,获取成功后
执行方法体,执行完成后在释放Monitor,其实ACC_Synchronized就是隐式的去调用monitorenter和monitorexit指令将方法锁住。
2.reentrantlock原理?
reentrantlock:是一种可重入的排他锁,主要用来解决多线程对资源共享竞争的问题。
有三个特性:
1.支持可重入,获得锁的线程在释放锁之前再去竞争同一把锁的时候,不需要加锁就可以重新访问
2.支持公平和非公平的特性,默认是非公平锁,
3.提供了阻塞竞争锁和非阻塞进程锁的两种方法,分别是lock()和trylock()方法。
底层实现的关键技术:
1.锁的竞争,是通过互斥变量,使用cas机制来实现,没有竞争到锁的线程AbstractQueuedsynchronized这样一个线程同步器来存储,他的底层是通过双向链表来实现,当锁释放的时候,会从
AQS队列的头部唤醒,下一个等待的线程
2.公平和非公平的特性,主要是体现在竞争锁的时候需要判断AQS队列中是否存在等待线程,公平锁需要去判断,非公平锁是直接进行竞争
3.锁的重入特性,AQS中有一个成员变量来保存当前获取锁的线程,当同一个线程在下次再来竞争锁的时候,就不会走锁的竞争逻辑,而是直接增加重入的次数
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值