什么是JUC
JUC是包名的缩写java.util.concurrent,为java语言提供多线程同步结构的支撑。
JUC是用于解决多线程同步问题,给java开发者提供便利的函数和功能、结构。
JUC的包结构:
第一部分:atomic原子类:同一时间只能有一个线程操作这个变量,线程退出前执行完这个变量所有的原操作。
第二部分:locks锁结构:多线程操作时用到的锁,如LOCK、ReadWriteLock等。
第三部分:除了atomic和locks之外的部分是工具类,工具类分为:线程同步结构和接口,线程同步结构又分为:队列、跳表、hashmap、线程池、栅栏等等。
JUC中锁概述
锁的意义:防止多线程同时执行一段指令的。
一个简单的例子:
在多CPU的环境下,保证一个方法指令同一时间只能一个cpu执行,这时候我们需要加一个锁来保证,如图:
如何实现一把锁?
实现一把锁需要解决如下四个问题:
1.如何表示当前锁状态?
一般情况下锁状态只有两种,有锁、无锁,但当发生锁重入时,需要记录锁重入的次数,所以表示锁状态采用 int ,0表示无锁,大于0表示锁重入次数。
2. 如何保证多线程抢锁线程安全?
硬件级别保证,通过命令: Lock cmpxchg
在Java中用Unsafe里CAS:public final native boolean compareAndSwapInt(Object o, long offset,int expected,int x);
3.如何处理没有获取到锁的线程?
自旋:线程不停的执行某个代码,知道条件满足或次数达到限制。
阻塞:达不到条件,告诉操作系统、把线程阻塞。
自旋+阻塞
4.释放锁后如何处理未获得锁的线程。
自旋:自己抢锁
阻塞: 唤醒