整理自模拟面试,覆盖多线程基础、线程安全、
synchronized、CAS、ReentrantLock、读写锁、公平锁、wait/notify
一句话:Android 采用单 UI 线程模型,主线程负责界面绘制和事件分发,耗时任务需要放到后台线程执行,再通过消息机制或协程切回主线程更新 UI。
Thread:最基础的线程单位,但管理成本高Executor / ThreadPoolExecutor,适合复用线程和控制并发数Handler / Looper / MessageQueue:线程间消息切换的经典方案一句话:多个线程并发访问共享可变状态时,如果程序结果仍然正确且可预期,就说明它是线程安全的;否则就会出现线程安全问题。
ArrayList、HashMap 这类非线程安全容器在并发读写下出错synchronized、ReentrantLockvolatileAtomicInteger、AtomicReferenceConcurrentHashMap、CopyOnWriteArrayListsynchronized 和 volatile 的区别volatile 解决什么问题synchronized 解决什么问题volatile:状态标记、开关量、一个线程写多个线程读synchronized:多个线程对共享资源进行复合读写操作volatile 更像“让值立刻可见”synchronized 更像“让临界区串行执行”count++ 不能只靠 volatilesynchronized 和 ReentrantLock 的区别| 维度 | synchronized |
ReentrantLock |
|---|---|---|
| 实现层级 | JVM 内置关键字 | JDK 显式锁 |
| 锁释放 | 自动释放 | 需手动 unlock() |
| 功能 | 简单直接 | 更灵活 |
| 可中断 | 不支持 | 支持 lockInterruptibly() |
| 尝试获取锁 | 不支持 | 支持 tryLock() |
| 公平性 | 不可配置 | 可选公平/非公平 |
| 条件队列 | wait/notify |
Condition |
synchronizedReentrantLocksynchronized 的原理是什么一句话:synchronized 本质是基于对象监视器 monitor 实现的内置锁,JVM 通过对象头中的 Mark Word 记录锁状态,并通过加锁与解锁建立线程间的内存可见性关系。
monitorenter 和 monitorexitACC_SYNCHRONIZEDthisClass 对象happens-before 关系Java 对象内存结构通常分为:
- 对象头
- 实例数据
- 对齐填充
Mark WordhashCode在加锁后保存偏向线程、锁记录指针或 Monitor 指针
类型指针 Klass Pointer
JVM 通过它知道对象属于哪个类
数组长度
Mark Word 在不同状态下存什么Mark Word 会随着对象状态变化复用不同内容:
hashCode + GC年龄 + 锁标志位线程ID + epoch + GC年龄 + 锁标志位指向 Lock Record 的指针 + 锁标志位指向 Monitor 的指针 + 锁标志位变化链路:
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁
Lock RecordMonitor全称:Compare And Swap
一句话:CAS 是一种无锁并发的原子操作,先比较内存中的当前值是否等于预期值,如果相等就更新,否则失败重试。
V:内存中的当前值A:预期值B:要更新的新值V == A,把值更新为 BAtomicIntegerAtomicBoolean一句话:当锁持有时间很短时,让线程先短暂空转等待,比直接阻塞和唤醒线程的系统开销更低。
Monitor 是什么一句话:Monitor 是 JVM 在重量级锁阶段用来管理互斥、阻塞和线程协作的监视器对象。
Monitor 负责什么ownerEntryListwait() 后进入等待状态的 WaitSetMonitor 统一管理wait()、notify()、notifyAll() 是谁的方法Object 类的方法Thread 类的方法Objectwait():当前线程释放对象锁,进入等待队列notify():唤醒一个等待该对象监视器的线程notifyAll():唤醒所有等待线程synchronized 块或同步方法中调用IllegalMonitorStateExceptionReentrantReadWriteLock 读写锁严格来说读写锁不是
ReentrantLock本身的方法,而是同一套显式锁体系里的ReentrantReadWriteLock
ReadLockWriteLockReentrantLock 的 Condition一句话:Condition 是 ReentrantLock 提供的条件队列机制,用于替代 wait/notify,并支持一个锁绑定多个等待队列。
await()awaitUninterruptibly()awaitNanos(long nanosTimeout)await(long time, TimeUnit unit)awaitUntil(Date deadline)signal()signalAll()wait/notify 的对应关系await() 对应 wait()signal() 对应 notify()signalAll() 对应 notifyAll()ConditionnotFull 和 notEmptyawait() 通常放在 while 循环里防止虚假唤醒ReentrantLock 默认策略new ReentrantLock(true) 指定公平锁Handler、线程池、协程volatile 保证可见性,不保证原子性synchronized 保证互斥、原子性、可见性ReentrantLock 更灵活,支持公平锁、可中断、ConditionMark WordMonitor