并发安全性之Lock锁及原理分析
个人学习笔记总结
文章目录
前言
锁是用来解决线程安全的,在此简单介绍J.U.C并发包下Lock的相关应用及原理分析。
一、Lock 与synchronized的区别
Lock是接口,它的实现类实现了手动操作锁的获取与释放,而synchronized是关键字,自动操作锁,性能上相差不大,synchronized相较与lock使用的更多,这里就不再叙述。二、ReentrantLock
1.ReentrantLock的基本使用
Lock lock = new ReentrantLock();
lock.lock()//抢占锁
lock.unlock()//释放锁
lock.lockInterruptibly()//抢占锁,可中断
boolean flag = lock.tryLock()//抢占锁,没抢占到不阻塞,根据应用场景使用
代码如下(示例):
2.ReentrantLock实现原理
满足线程的互斥特性,意味着同一时刻,只允一个线程进入到加锁的代码中(多线程环境下,线程的顺序访问)。三、锁的设计猜想
-
一定会涉及到锁的抢占,需要一个标记来实现互斥。全局变量(0,1)。
-
抢占到锁如何处理(无需额外处理)
-
没抢占的锁如何处理
-
需要等待(让处于排队中的线程,没抢占到线程,先阻塞释放cpu资源)
如何让线程等待?
wait/notify(线程通信的机制,无法唤醒一个指定的线程)
LockSupport.park/unpark(阻塞一个指定的线程,唤醒一个指定的线程)
Condition -
需要排队(允许有n个线程被阻塞,通过数据结构,把n个排队的线程存储起来)
-
抢占到锁的释放过程如何处理
LockSupport.unpark()唤醒处于队列中的指定线程
-
锁抢占的公平性(是否允许插队)
公平
非公平
总结
以上就是今天的内容,本文仅仅简单介绍了ReenTrantLock的使用,以及锁的设计思想。
部分引用自 咕泡学院