不积跬步,无以至千里。不积小流,无以成江海。

锁的实现分类

java虚拟机对锁的实现方式分为:内部锁、显示锁。

内部锁是通过synchronization关键字实现的,显示锁是通过java.concurrent.locks.Lock接口的实现类实现的。

锁的几个概念

可重入性: 一个线程在持有一个锁的时候能否再次(或者多次)申请该锁。如果可以称为:“可重入锁”,如果不可以称为:“非可重入锁”。(可重入锁可以理解成一个对象,该对象包含一个计数器属性。初始时为0,每次有线程获得锁时,计数器加1。)

锁的征用与调度: 锁的调用策略分为公平策略和非公平策略,相应的锁就被称为公平锁和非公平锁。内部锁属于非公平锁,而显示锁既支持公平锁也支持非公平锁。

锁的粒度: 一个锁实例可以保护一个或者多个共享数据。锁保护的共享数据的数量大小就被称为锁的粒度。锁的粒度过大会导致等待锁的时间过长,锁的粒度过小会增加调度开销。

锁的状态

锁主要存在四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁。但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级。