线程安全-4 AQS&Lock&ReentrantLock

一.什么是AQS?

1.AQS,AbstractQueuedSynchronizer,抽象队列同步器,是一个用于构建锁和同步器的框架。

2.基于AQS实现的锁或同步器有:可重入锁ReentrantLock、计时锁CountDownLatch、信号量Semaphore等

3.AQS三大核心

(1)state:用整型变量state来标记共享变量的状态,多线程通过操作state来实现锁或同步器机制,state需要用volatile修饰。

(2)queue:AQS内部维护一个基于FIFO算法和双向链表实现的队列。若线程请求共享变量失败,则会被包装成一个Node节点,存到队列尾部。当共享变量空闲,则会唤醒队列的第一个线程去操作变量。

(3)CAS:多线程操作state是通过CAS操作完成的。

4.AQS的两种模式:独占锁和共享锁

(1)独占锁:共享变量只能被一个线程获取到。state初值为0,表示无锁状态,线程可以使用;当线程获取到锁,则通过CAS操作对state加1,表示变量被上锁,其他线程不能使用;当state为0时会唤醒队列中的第一个线程。

(2)共享锁:共享变量可以被多个线程获取到。state初值为N,表示可以被N个线程使用;当线程获取到锁,则通过CAS操作对state减1;当state为0时,其他线程陷入阻塞;当有一个线程释放锁,就会唤醒队列中的第一个线程。

二.synchronized和Lock的区别

1.语法层面

(1)synchronized是关键字,源码在jvm中,由c++实现

(2)Lock是jdk提供的一个接口,由java实现

2.释放锁的方式

(1)synchronized在执行完代码块或者执行发生异常时,会自动释放锁

(2)Lock在执行完代码或者执行发生异常时,都不会主动释放锁,必须调用unlock()手动释放锁

3.功能层面

synchron

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值