The Java lock usage(1)

啥叫锁?没有找到官方的定义,搜了下百度百科,除了日常用所之外啥都没有。又搜了下对象锁,嗯。。果然
有描述。先来看看啥叫对象锁:

对象锁是指Java为临界区synchronized(Object)语句指定的对象进行加锁,对象锁是独占排他锁。

也就是说在我们Java中,我们可以通过synchronized的来进行加锁。

其实在Java SE5之后,Java在java.util.concurrent类库
中还提供了名为Lock的锁机制。Lock对象必须要创建、锁定和释放,相比synchronized{}来说,用起来不得不说很麻烦。
这是为了一些特殊的要求而存在的。下面先简单减少一下锁定种类:

  • 悲观锁,乐观锁
  • 独占锁,共享锁
  • 公平锁,非公平锁

日常生活中都没有这么多锁,码农就是喜欢搞事情,居然创造了这么多锁。其实这是按照四种分类方式,归纳出的锁的叫法。

悲观锁与乐观锁

这一组的叫法是我们最常听到的叫法。Pessimistic Lock悲观锁,就是指用最最悲观的情绪去那数据,每次去获取数据的时候都
很小心谨慎,认为别人有可能修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁;Optimistic
Lock乐观锁,就是很乐观的心态去拿数据,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在
此期间别人有没有去更新这个数据,可以使用版本号等机制。

我们一般可以通过下面几个方面来判断使用哪个锁:

  1. 响应速度:如果需要非常高的响应速度,并且写操作相对于读操作来说很少,则建议采用乐观锁方案,成功就执行,
    不成功就失败,不需要等待其他并发去释放锁
  2. 冲突频率:如果冲突频率非常高,建议采用悲观锁,保证成功率,如果冲突频率大,乐观锁会需要多次重试才能成功
    ,代价比较大,反而会降低执行速度
  3. 重试代价:如果重试代价大,建议采用悲观锁

乐观锁的实现:cas、mvvc
悲观锁的实现:因为MySQL默认使用autocommit模式

独占锁,共享锁

独占锁与共享锁,线程对象是多个线程;
独占锁,从名字上就可以知道,一个线程获取了锁,其它线程就不能获取到锁,必须等锁释放了,才能可能获取到锁。
共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。
通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。

公平锁,非公平锁

什么叫做公平呢?
公平锁,就相当于是食堂打饭,一个一个排队有个先来后到。按照这个逻辑来获取锁,先启动的先获取锁,后启动的后获取锁。

非公平锁,就是赛车比赛,我们不用排队,那个先发动机性能好,谁就先获得锁。

锁的小知识先介绍到这里,下次在重点说一说Java中的锁。