并发基础与CAS基本原理
💡
原文中文,约8300字,阅读约需20分钟。
📝
内容提要
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但不释放锁。
- 达观锁与失望锁的区别是达观锁会重新检查是否被修改。
➡️