1. 并发编程基础
- 并发定义:多个逻辑控制流在时间上的重叠。
- 操作系统并发机制:通过进程、I/O多路复用和线程实现。
- 线程:在单一进程上下文中运行的逻辑流,共享地址空间,由内核调度。
2. 线程安全
- 线程安全定义:在多线程访问下,无需额外同步或协调即可保证正确结果。
- 线程安全挑战:多线程环境下共享变量的访问和修改可能导致不可控结果。
3. JVM对并发编程的支持
- JUC(java.util.concurrent):提供多线程编程和并发控制的接口和类。
- 锁:如
ReentrantLock
、ReentrantReadWriteLock
、StampedLock
。 - 线程池:如
ThreadPoolExecutor
。 - 原子类:如
AtomicInteger
、AtomicLong
、AtomicReference
。 - 同步器:如
Semaphore
、CountDownLatch
、CyclicBarrier
。 - 并发容器:如
ConcurrentHashMap
、BlockingQueue
、CopyOnWriteArrayList
。
- 锁:如
4. 锁机制
synchronized
关键字:基于Object类,提供线程同步和通信的wait()
、notify()
、notifyAll()
方法。IllegalMonitorStateException
:当线程未拥有监视器时尝试使用监视器方法时抛出。
5. ReentrantLock
使用
- 示例:如何使用
ReentrantLock
进行线程同步,包括尝试获取锁、锁的状态检查和释放锁。
6. Condition
接口
- 作用:提供比Object的
wait()
和notify()
更细粒度的线程间协作控制。 - 优势:支持关联特定条件的多个等待线程集合,提高线程间协作的安全性和效率。
7. 无锁机制
- 核心:通过原子操作和内存模型避免使用传统锁,实现高效的并发控制。
- 实现:基于CAS(Compare-And-Swap)和自旋机制。
- 优点:减少线程上下文切换开销,提高系统吞吐量和响应时间。
- 缺点:可能导致CPU资源浪费,在竞争激烈的情况下可能不如传统锁高效。
8. 自旋锁
- 概念:在条件不满足时,线程持续检查条件而不是阻塞。
- 示例:如何使用自旋锁实现无锁的递增操作。
9. 从有锁到无锁的演进
- 动机:减少锁的开销,提高并发性能,简化并发编程复杂性。
- 效果:提升系统吞吐量,减少死锁和饥饿问题。