Java锁

乐观锁和悲观锁
悲观锁和乐观锁并不是某个具体的“锁”而是一种并发编程的基本概念。乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入。

悲观锁
悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此对于同一个数据的并发操作,悲观锁采取加锁的形式。悲观地认为,不加锁的并发操作一定会出问题。

乐观锁
乐观锁正好和悲观锁相反,它获取数据的时候,并不担心数据被修改,每次获取数据的时候也不会加锁,只是在更新数据的时候,通过判断现有的数据是否和原数据一致来判断数据是否被其他线程操作,如果没被其他线程修改则进行数据更新,如果被其他线程修改则不进行数据更新。
公平锁和非公平锁
根据线程获取锁的抢占机制,锁又可以分为公平锁和非公平锁。

公平锁

公平锁是指多个线程按照申请锁的顺序来获取锁。

非公平锁
非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。
ReentrantLock 提供了公平锁和非公平锁的实现。

公平锁:new ReentrantLock(true)
非公平锁:new ReentrantLock(false)

独占锁和共享锁

根据锁能否被多个线程持有,可以把锁分为独占锁和共享锁。
独占锁
独占锁是指任何时候都只有一个线程能执行资源操作。

共享锁
共享锁指定是可以同时被多个线程读取,但只能被一个线程修改。比如 Java 中的 ReentrantReadWriteLock 就是共享锁的实现方式,它允许一个线程进行写操作,允许多个线程读操作。可重入锁(Synchronized)
可重入锁指的是该线程获取了该锁之后,可以无限次的进入该锁锁住的代码。自旋锁
自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗 CPU。
CAS 与 ABA
CAS(Compare and Swap)比较并交换,是一种乐观锁的实现,是用非阻塞算法来代替锁定,其中 java.util.concurrent 包下的 AtomicInteger 就是借助 CAS 来实现的。
但 CAS 也不是没有任何副作用,比如著名的 ABA 问题就是 CAS 引起的。
1.
在 JDK 1.5 的时候,Java 提供了一个 AtomicStampedReference 原子引用变量,通过添加版本号来解决 ABA 的问题

Atomic类的实现也是通过CAS自旋实现的 底层直接通过native调用本地方法去当中的c++代码实现,c++当中 lock cmpxchg 方法来实现
look大部分都是 缓存锁或者总线锁定()
锁升级
无锁、偏向锁、自旋锁、重量级锁
锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。
偏向锁 不加锁但是在头部设置一个标志位 表示是否在使用,如果发生并发问题就升级锁,但是偏向锁在jdk14取消了
锁如何升级
只有有线程竞争 就会升级成轻量级锁,自旋一定次数以后变成重量级锁( 自旋次数超过10次时直接升级为重量级, jvm有个参数 preSpinLock,默认是10次,可以自己设置 )
如果自旋线程的数量超过了cpu的二分之一,也会直接升级为重量级锁
AQS
AQS是一个抽象的队列同步器,通过维护一个共享的资源状态和一个先进先出的线程等待队列来实现一个多线程访问共享资源的同步框架AQS为每个共享资源都设置了一个共享资源锁,线程在需要访问共享资源时首先需要获得共享资源锁,如果获取到了共享资源锁,既可以在当前线程使用该共享资源,如果获取不到,则将该线程放入等待队列中,等待下次调度 JUC包下的一个基类,大部分跟并发有关的都是基于该类继承关系重入锁和信号量都在自己内部,实现了一个AbstractQueuedSynchronizer的子类,子类的名字都是Sync在AbstractQueuedSynchronizer内部,有一个队列,我们把它叫做同步等待队列。它的作用是保存等待在这个锁上的线程(由于lock()操作引起的等待)。此外,为了维护等待在条件变量上的等待线程,AbstractQueuedSynchronizer又需要再维护一个条件变量等待队列,也就是那些由Condition.await()引起阻塞的线程。由于一个重入锁可以生成多个条件变量对象,因此,一个重入锁就可能有多个条件变量等待队列。实际上,每个条件变量对象内部都维护了一个等待列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值