并发基础与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但不释放锁。
  • 达观锁与失望锁的区别是达观锁会重新检查是否被修改。
➡️

继续阅读