Lock体系

synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;
而Lock则必须要用户去手动释放锁,用**unlock()**方法释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
原理:AQS–独占锁
Lock体系

防止死锁Lock体系
Lock体系

1.AbstractQueuedSynchronizer(AQS) 队列式同步器
作用:处理线程 锁的获取与释放.
原理:双端队列+CAS.
Lock体系
Lock体系
3.通信机制—Condition
Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Condition与Lock配合完成等待通知机制,前者是java底层级别的,后者是语言级别的,具有更高的可控制性和扩展性。Lock体系
Lock体系
5. java.util.concurrent 包下的常见类

基于AQS共享锁实现

5.1Semaphore 一个计数信号量,主要用于控制访问某一资源的线程数。
从信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。

5.2. ReentrantLock介绍 (可重入锁)
实现Lock接口的类, 支持重入性, 能够对共享资源重复加锁, 即当前线程获取该锁不会被阻塞., 也支持公平锁和非公平锁.
原理:线程获取锁时,如果线程是当前线程,则可以再次获取成功; 释放锁时,获取多少次则就要释放多少次.,
ReentrantLock支持两种锁:公平锁和非公平锁。何谓公平性,是针对获取锁而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求上的绝对时间顺序,满足FIFO。
读写锁ReentrantReadWriteLock
读写锁允许同一时刻被多个读线程访问,但是在写线程访问时,所有的读线程和其他的写线程都会被阻塞。
Lock体系

5.3CountDownLatch
CountDownLatch是一个同步计数器,能够保证在其他线程完成某一个业务操作前,当前线程一直处于等待/阻塞状态
等到所有子线程完成工作之后再进行汇总的情形, 好像跑步比赛,10个选手依次就位,哨声响才同时出发;所有选手都通过终点,才能公布成绩。
计数器将会从给定的某一个数值count开始,通过countDown()方法的调用进行倒数。当执行某一次countDown()操作后,计数器的count数值等于0,所有调用了await()方法的线程,就解除等待/阻塞状态继续执行。
Lock体系
6.ThreadLocal
对于 ThreadLocal 类型的变量,在一个线程中修改,不影响其在其它线程中的值。也就是说 ThreadLocal 类型的变量的值在每个线程中是独立的。
Lock体系
Lock体系
Lock体系