什么是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.释放锁后如何处理未获得锁的线程。
自旋:自己抢锁
阻塞: 唤醒
JUC是Java并发编程的核心库,提供了原子类、锁机制和其他同步工具类。本文深入探讨了JUC包的三大组成部分:原子类、锁结构以及工具类,并详细介绍了锁的实现,包括锁的状态表示、线程安全的抢锁策略、未获取锁的线程处理以及锁释放后的处理机制。通过对JUC的学习,开发者可以更好地理解和解决多线程同步问题。
2300

被折叠的 条评论
为什么被折叠?



