java偏向锁,自旋锁,轻量级锁,重量级锁,重入锁

重量级锁:一个同步的A线程对应着一个monitor对象(该对象和锁对象是异议对应的关系,用来记录等待获得锁对象的锁标记的线程和已经获得锁标记的线程),堆空间对象的对象头上会记录一个,这个锁信息指向monitor对象,monitor对象监控在对象头中的锁信息,B线程还想到该对象内去获取锁信息时,因为对象头中锁信息已经指向了monitor对象,所以B无法获取到锁对象的对象头中的锁标记,进入等待队列(锁池状态,阻塞状态),当A结束后,对象头释放锁标记(对象头的锁信息不在指向monitor),B就可以让锁对象中对象头的锁信息指向monitor对象,即获得锁标记,相互关联。

重入锁:monitor对象是一个ObjectMonitor的特殊对象,它其中有两个队列(记录阻塞线程的位置),_WaitSet(WaitSet管理等待队列线程,即在synchronize中使用了wait方法)和_EntryList(管理锁池阻塞线程,即无法获取锁标记),当线程获取锁标记时,monior对象的_Owener会记录此线程,并在monitor中的计数器执行递增计算(+1),若当前线程调用其他同步代码块,而且同步代码块的锁对象相同时,monitor的计数器会继续递增(+1),这就是锁的重入,每个代码块执行结束,计数器都会递减,所有的代码块执行结束后,monitor的计数器值为0,释放锁标记,_Owner标记赋值为null,锁池队列的其他线程会竞争来拥有这把锁。

偏向锁:如果代码中不可能出现多线程并发争抢同一个锁的时候(没有其他线程争夺这个锁对象),例如

public void m1(){
	Object o = new Object();
	synchronized(o){

	}
}

jvm编译代码,解释执行时,会制动放弃同步信息。使用锁标记记录锁状态,monitor对象的变量ACC_SYNCHRONIZED。当变量使用的时候,代表偏向锁锁定,这样可以避免锁的争抢和锁池状态的保护,提高效率

轻量级锁:是一种过度锁,偏向锁不满足时,即有多个线程并发访问同一个锁对象,偏向锁提升成轻量级锁,使用ACC_SYNCHRONIZED标记记录,ACC_UNSYNCHRONIZED记录另一个等待的线程位置(这种锁是针对两个线程的并发使用的,作用和偏向锁差不多,但是两个线程不一定会使用这种锁机制,还可能使用重量级锁)

自旋锁:是偏向锁和轻量级锁的过渡,当获取锁的过程中,如果没有获取到,为了提高效率,不进入阻塞,而是jvm自动执行若干次空循环,再次申请锁。避免线程状态的变更。

小白一枚,有错的地方还请各位大佬们指出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值