对象是过程的抽象,线程是调度的抽象
并发是一种架构设计:并发不是简单的 “用
Thread
跑个任务”。它是一种宏观的设计决策,应该在架构设计早期就考虑,而不是事后添加。它可以将“做什么”和“何时做”解耦。并发与性能不是等价的:
并发:结构性问题。旨在让程序在同一时间做多件事(更清晰的设计)。
并行:性能问题。旨在让程序在更短的时间内做一件事(提高速度)。
并发可以带来并行,从而提升性能,但这不是唯一目的。并发只有在多个线程或处理器之间能分享大量等待时间的时候管用
并发编写的核心难点:对共享数据的正确访问。不同执行线程对同一数据资源的竞争和协作是万恶之源。
并发防御原则:
单一权责原则 (SRP):并发相关的代码应该有自己独立的开发、修改和调优的生命周期。不要将并发代码与其他业务代码混在一起。
限制数据作用域:共享数据是危险的。严格限制哪些数据可以被共享,并通过精细的同步机制来保护它们。
使用数据副本:尽可能避免共享,使用数据的副本进行处理。
线程应尽可能独立:让每个线程在自己的世界中运行,不与其他线程共享数据。例如,使用
ThreadLocal
变量。