java锁相关(上)

本文主要内容:

1、锁相关概念

2、同步关键字Synchronization

3、同步关键字Synchronization锁原理


一、锁相关概念

自旋锁:为了不放弃cpu执行事件,循环的使用cas技术对数据尝试进行更新,直至成功。

悲观锁:假定会发生并发冲突,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制

乐观锁:假定不会发生并发冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。

独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁;(单写)

共享锁(读):给资源加上读锁后只能读不能改,其他线程也只能加读锁,不能加写锁;(多读)

可重入锁/不可重入锁:可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。

公平锁/非公平锁:所谓公平锁,多个线程抢占某个资源的时候,按照顺序进行获取锁,释放锁。而非公平锁,当一个线程释放锁后,其他线程不会按照顺序进行锁的获取,排在后面的线程也可能抢到锁。


二、同步关键字Synchronization

属于最基本的线程通信机制,基于对象监视器实现的。Java中的每一个对象都与一个监视器相关连,一个线程可以锁定或解锁。一次只有一个线程可以锁定监视器。试图锁定该监视器的任何其他线程都会被阻塞,直到他们可以获得该监视器上的锁定为止。

特性:悲观锁,可重入锁,独享。

锁范围:对象锁,类锁,锁消除,锁粗化


三、同步关键字Synchronization加锁原理

HotSpot中,对象前面会有一个类指针和标题,存储标识哈希码的标题字以及用于分代垃圾收集的年龄和标记位。默认情况下jvm锁会经历:偏向锁--轻量级锁-重量级锁 这些状态。


偏向锁,本质就是无锁,如果没有发生过任何多线程争抢锁的情况,JVM认为就是单线程,无需做同步(jvm为了少干活,如果没有争用,就不需要去做同步加锁操作。)

修改mark word如果失败,会自旋cas一定次数,该次数可以通过参数配置;超过次数,仍未抢到锁,则锁升级为重量级锁,进入阻塞。monitor也叫管程,计算机操作系统原理中有提及类型概念。一个对象会有一个对应的monitor.

你可能感兴趣的:(java锁相关(上))