编程语言
首页 > 编程语言> > Java锁机制总结

Java锁机制总结

作者:互联网

1. 什么是线程安全问题?

多线程操作公共对象时,如何保证对象数据不变脏。

2. synchronized和ReentrantLock锁的区别?

synchronized,在写法上变现为原生语法级别,是非公平锁,可重入锁,java 1.6版本前性能较差,

reentranLock, 也是可重入锁,写法上变现为API级别的锁,相对synchronized有更多高级的功能,主要有一下三个:

可实现公平锁:可以按照申请锁的时间顺序来获取锁

等待可中断:持有锁的线程长期不释放锁的情况下,等待的线程可以选择放弃,改为处理其他事情),

锁可以绑定多个条件:可同时绑定多个conditon对象

性能方面:java 1.6版本后 ,synchronized和reenTranlock相比,性能差不多

3. java中的锁有什么样的特性?

自旋特性:java1.6版本后,自旋默认开启,阻塞的线程在一段时间内会不断的尝试取获取锁资源,在尝试一定次数之后,如果还不能获取到锁资源,就将此线程挂起。

锁消除特性:不可能存在共享的数据,即使使用了加锁,也会被锁消除机制消灭掉。

锁粗化:如果有一系列操作对某个对象反复进行加锁和解锁的操作,会导致很多不必要的性能损耗。虚拟机会对这种场景进行优化,只保留一个加锁,加锁范围扩展到从第一加锁范围开水,到最后一次加锁范围结束

4. java中锁的级别?

轻量锁:从对象头中存放锁的标志位来看,对象被加轻量锁时,标志位是00。轻量锁时具备自旋的特性。

重量锁:从对象头中存放锁的标志位来看,对象被加轻量锁时,标志位是10。如果有两条以上的线程争用一个锁,那锁就会从轻量锁升级为重量锁

偏向锁:优化无竞争条件下同步语句的性能,不会通过CAS操作去改变锁标记位,所以此时的锁标记位置还是01(和未加锁时一样),只会偏向第一个获取锁对象的线程,当有另外一个线程尝试去获取锁时,偏向模式结束。java 1.6版本后默认开启。与无加锁的状态对比,加上偏向锁后,对象头会绑上对应的线程id。

 

 

标签:总结,加锁,Java,对象,线程,锁时,java,机制,轻量
来源: https://blog.csdn.net/langsiming/article/details/111096799