并发基础与CAS基本原理
内容提要
Java中的线程与锁有6种状态:就绪、运行、等待、堵塞、超时等待和终止。线程进入堵塞态只能通过synchronized关键字,调用lock无法实现。开释锁的操作有多种情况,包括同步代码块执行完毕、遇到break或return、出现未处理的异常、调用wait()方法等。死锁的必要条件有互斥、请求和坚持、不可剥夺和循环等待。活锁是两个线程不断获取和释放锁而没有实际操作的情况。CAS(compare and swap)是一种原子操作,用于实现无锁编程。线程池和堵塞队列可以解决生产者和消费者的耦合问题。AQS(AbstractQueuedSynchronizer)是实现锁的基础结构,支持独占锁和共享锁。JMM(Java Memory Model)规定了线程对内存的访问规则。volatile关键字可以保证可见性,但不能保证原子性。锁的升级过程有倾向锁、轻量级锁、自旋锁和重量级锁。Synchronized是内置锁,ReentrantLock是显示锁。volatile在DCL(Double-Checked Locking)中起到禁止指令重排序的作用。sleep、wait和yield的区别是sleep让出CPU,wait让线程等待并释放锁,yield让出CPU但不释放锁。达观锁和失望锁的区别是达观锁会重新检查是否被修改。
关键要点
-
Java中线程的6种状态:就绪、运行、等待、堵塞、超时等待和终止。
-
线程进入堵塞态只能通过synchronized关键字,调用lock无法实现。
-
开释锁的操作包括同步代码块执行完毕、遇到break或return、出现未处理的异常、调用wait()方法等。
-
死锁的必要条件有互斥、请求和坚持、不可剥夺和循环等待。
-
活锁是两个线程不断获取和释放锁而没有实际操作的情况。
-
CAS(compare and swap)是一种原子操作,用于实现无锁编程。
-
线程池和堵塞队列可以解决生产者和消费者的耦合问题。
-
AQS(AbstractQueuedSynchronizer)是实现锁的基础结构,支持独占锁和共享锁。
-
JMM(Java Memory Model)规定了线程对内存的访问规则。
-
volatile关键字可以保证可见性,但不能保证原子性。
-
锁的升级过程有倾向锁、轻量级锁、自旋锁和重量级锁。
-
Synchronized是内置锁,ReentrantLock是显示锁。
-
volatile在DCL(Double-Checked Locking)中起到禁止指令重排序的作用。
-
sleep、wait和yield的区别是sleep让出CPU,wait让线程等待并释放锁,yield让出CPU但不释放锁。
-
达观锁与失望锁的区别是达观锁会重新检查是否被修改。
延伸问答
Java中线程的状态有哪些?
Java中线程的状态包括就绪、运行、等待、堵塞、超时等待和终止。
什么是CAS操作,它的基本原理是什么?
CAS(compare and swap)是一种原子操作,由CPU确保,允许在多线程环境中安全地更新变量。
如何避免死锁?
避免死锁的策略包括有序资源分配法和银行家算法。
volatile关键字的作用是什么?
volatile关键字确保变量的可见性,禁止指令重排序,但不能保证原子性。
什么是线程池,它的优势是什么?
线程池是一种管理线程的机制,可以重用线程,减少创建和销毁线程的开销,提高系统性能。
sleep、wait和yield的区别是什么?
sleep让出CPU但不释放锁,wait让线程等待并释放锁,yield让出CPU但不释放锁。