并发(concurrency)不是同时执行,而是“看起来能同时处理多个任务”
Java 中的 concurrency 描述的是程序结构能力:多个任务交替推进、共享资源、有协作或竞争关系。它不依赖 CPU 核数,单核机器上用线程切换也能实现并发——比如 ExecutorService 提交 10 个 Runnable,实际可能只在一个核心上轮转执行。
关键点在于「调度权在 JVM 和 OS」,你写的代码要处理状态共享、可见性、原子性问题。常见错误现象包括:int count++ 在多线程下结果小于预期、HashMap 报 ConcurrentModificationException、volatile 修饰了但没解决复合操作竞态。
- 使用场景:I/O 密集型任务(如 HTTP 请求、数据库查询),线程大部分时间在等响应,此时并发能提升吞吐
- 典型工具:
ExecutorService、CompletableFuture、ReentrantLock、AtomicInteger - 不要误以为开了 10 个
Thread就等于 10 个任务并行运行——它们只是被并发调度
并行(parallelism)必须有多核,且真正同时执行
parallelism 是并发的一种物理实现方式,强调“同一时刻多个任务在不同 CPU 核心上执行”。Java 8+ 的 Stream.parallel()、ForkJoinPool 默认使用公共池(ForkJoinPool.commonPool()),其并行度通常等于 Runtime.getRuntime().availableProcessors() - 1(避免抢占主线程)。
但并行 ≠ 更快。如果任务太轻量(比如纯算术累加 100 次),线程拆分、合并、同步开销反而拖慢整体;如果数据结构不支持无锁遍历(如 ArrayList 可以,LinkedList 不适合并行流),也会退化成串行或抛异常。
立即学习“Java免费学习笔记(深入)”;