程序员如何处理「并发问题」:不是玄学,是原理
并发问题是程序员的噩梦之一。
很多人觉得并发很难,其实是没理解原理。
一、为什么会有并发问题
多个线程同时访问共享资源,导致数据不一致。
比如:
- 两个线程同时给 count++
- 结果可能只加了 1 次,而不是 2 次
二、并发问题的常见场景
1. 共享变量
多个线程同时读写同一个变量。
2. 竞态条件
执行结果依赖于线程的执行顺序。
3. 死锁
两个线程互相等待对方释放资源,谁也走不了。
三、怎么解决并发问题
1. 锁
用锁保护共享资源,同一时刻只有一个线程能访问。
优点:简单 缺点:性能损耗,可能死锁
2. 无锁方案
用原子操作、CAS(Compare And Swap)等。
优点:性能好 缺点:复杂
3. 避免共享
不用共享变量,用消息队列、本地存储等。
四、怎么写并发代码
1. 尽量不用共享
能用本地变量就不用共享变量。
2. 最小化锁的范围
锁住的时间越短越好。
3. 注意锁的顺序
多个锁要按固定顺序获取,避免死锁。
4. 优先用高层抽象
ThreadPoolExecutor、ConcurrentHashMap 等,比手写锁更安全。
五、一句话总结
并发问题 = 理解原理 + 选择合适方案 + 最小化共享 + 用高层抽象。