Java多线程核心在于安全协同而非单纯启动线程:通过Runnable+Thread或ExecutorService创建管理线程;用synchronized/Lock保障临界区安全;volatile和原子类解决轻量级可见性与原子性;线程池统一管控生命周期。

Java中实现多线程并发执行,核心是让多个线程能同时运行、合理协作,并避免共享资源引发的数据错乱。关键不在于“能否启动多个线程”,而在于“如何安全、可控地让它们协同工作”。
使用Thread类或Runnable接口创建线程
这是最基础的多线程起点。Thread代表一个执行单元,Runnable定义任务逻辑。
- 继承Thread并重写run()方法:简单直接,但因Java单继承限制,扩展性较差
- 实现Runnable接口并传入Thread构造器:推荐方式,更符合面向对象设计,也便于后续接入线程池
- 调用start()启动线程(不是run()!),JVM才会真正调度它进入就绪状态
用synchronized或Lock保证线程安全
多个线程访问同一变量或对象时,可能因指令交错导致结果异常。必须对临界区加锁。
- synchronized可修饰方法或代码块,自动获取/释放对象监视器,简单可靠
- ReentrantLock提供更灵活的锁控制(如尝试获取、超时、公平性),需手动lock()/unlock(),建议配合try-finally使用
- 注意锁的对象要一致——锁this、锁class、锁特定对象,效果完全不同
借助volatile和原子类处理轻量级可见性与原子更新
不是所有场景都需要重量级锁。当只需解决变量读写可见性或简单计数时,可选更高效方案。
立即学习“Java免费学习笔记(深入)”;
- volatile确保变量修改对其他线程立即可见,禁止指令重排序,但不保证复合操作(如i++)的原子性
- AtomicInteger、AtomicReference等原子类基于CAS(Compare-And-Swap)实现无锁原子操作,适合计数器、状态标志等场景
用ExecutorService统一管理线程生命周期
手动new Thread易造成资源浪费或失控。线程池是生产环境的标准实践。
- 通过Executors工厂创建常见线程池(如newFixedThreadPool、newCachedThreadPool),或直接用ThreadPoolExecutor精细配置
- 提交任务用submit(Runnable)或submit(Callable),后者可返回Future获取执行结果
- 务必在合适时机调用shutdown()或shutdownNow(),避免线程泄漏










