代码之尖·Java篇

常见的并发锁

2018-09-02  本文已影响891人  游牧族人

乐观锁

乐观锁总是认为数据是安全的,当我们获取数据的时候总是认为不会有其他人去尝试修改数据信息,因此获取数据时不会上锁,但是在对数据更新时会去判断原数据是否已经被修改。若没有被修改则更新当前数据,否则重新尝试。乐观锁一般使用添加 version 字段或 CAS 方式实现。

悲观锁

悲观锁总是认为数据是不安全的,但我们获取数据的时候总是认为会有其他人尝试修改数据而导致数据不一致,因此在获取数据时会加锁,其他线程无法对共享数据进行操作,直到锁线程操作结束。java中的synchroinzed关键字就是一种悲观锁。

乐观锁与悲观锁属于抽象锁,他定义了锁的实现原理,但并不是具体的实现锁。


自旋锁

自旋锁是一种保护多线程共享资源的锁类型,自旋锁在尝试获取锁时若竞争失败则不会使线程挂起而是循环继续尝试获取锁。由于自旋锁不会阻塞线程,因此线程会持续消耗CPU资源,若是长时间没有获取锁,则是对CPU资源的一种浪费。

自旋锁适用于线程锁竞争不激烈同时线程占用锁的时间不长的多线程环境下

互斥锁

互斥锁是一次最多只能有一个线程持有的锁。当一个线程持有互斥锁后,其他线程便进入阻塞状态,直到锁线程执行完同步代码块释放同步锁其他线程才有机会继续竞争锁。

互斥锁适用于线程竞争激烈且线程占用锁时间比较长的多线程环境下


重入锁

一种对于同一个线程可以多次进入的互斥锁。每进入一次线程数量加一,退出一次线程数量减一,直到锁线程数量为零时释放当前锁。java 中重入锁的实现为 ReentrantLock 。


JVM锁

Java对象头

锁分类

锁状态级别:无锁状态---偏向锁---轻量级锁---重量级锁
这四个锁状态会随着线程之间的竞争激烈程度进行升级,其中锁状态只能升级而不能降级。这是为了提高获取锁和释放锁效率。

偏向锁,轻量级锁都属于乐观锁,重量级锁属于悲观锁

上一篇 下一篇

猜你喜欢

热点阅读