简单来说,并发是指并行运行多个程序或程序多个部分的能力。并发使程序能够通过利用底层操作系统和机器硬件的未开发能力来实现高性能和吞吐量。例如,现代计算机具有多个 CPU 或单个 CPU 内部具有多个核心,程序可以为处理的某些部分使用所有核心;从而在与顺序处理相比,更早地完成任务。
Java 并发的基础是线程。线程是一个轻量级进程,它拥有自己的调用栈,但可以访问同一进程中其他线程的共享数据。Java 应用程序默认在单个进程中运行。您可以在 Java 应用程序中使用多个线程来实现并行处理或并发。
1. 哪些因素使 Java 应用程序实现并发?
在最初的类中,您需要使 Java 类实现并发,就是 java.lang.Thread 类。这个类是 Java 中所有并发概念的基础。然后您有 java.lang.Runnable 接口,用于将线程行为抽象化到线程类之外。
构建高级应用程序所需的其他类可以在 Java 1.5 中添加的 java.util.concurrent 包中找到。
2. Java 并发真的那么简单吗?
上述描述给人留下这样的印象,即并发确实是一个很好的概念,并且非常容易实现。好吧,事实并非如此。它需要对基本概念有很好的理解,并且要清楚应用程序的目标。
与单线程应用程序相比,并发应用程序通常具有更复杂的设计。由多个线程访问共享数据的代码需要特别注意。由于线程同步不正确而产生的错误很难检测、重现和修复。它们通常出现在更高的环境中,如生产环境中,并且有时在较低的环境中无法复现该错误。
除了复杂的缺陷之外,并发还需要更多的资源来运行应用程序。因此,请确保您拥有足够的资源。
3. Java 并发教程
在一个帖子中涵盖整个 Java 并发几乎是不可能的。因此,我写了以下 Java 并发教程,每个帖子讨论一个单独的概念。请浏览这些教程,如果有什么问题或建议,请告诉我。
3.1. Java 并发基础
- 并发演变
- 什么是线程安全?
- 如何在 Java 中创建和启动新线程
- 设置和获取线程名称
- 杀死线程
- 加入线程
- 线程优先级
- 守护线程
- 对象级锁和类级锁
- 比较和交换 [CAS] 算法
- wait()、notify() 和 notifyAll() 方法
- 解决 IllegalMonitorStateException
- 解决 InterruptedException
3.2. 区别
- “实现 Runnable” 和 “扩展 Thread” 的区别
- Callable 和 Runnable 的区别
- 锁和监视器之间的区别
- yield() 和 join() 的区别
- sleep() 和 wait() 的区别?
- Semaphore 与 ReentrantLock 的区别
3.3. 执行器框架
- 执行器框架教程
- ExecutorService shutdown()、shutdownNow() 和 awaitTermination()
- ExecutorService invokeAll()
- ExecutorService invokeAny()
- ScheduledThreadPoolExecutor – 使用执行器进行任务调度
- ScheduledExecutorService – 在延迟后在执行器中运行任务
- 固定大小的线程池示例
- ThreadPoolExecutor 示例
- ThreadPoolExecutor + Callable + Future 示例
- 使用 Semaphore 节流任务提交
- BlockingQueue 示例
- UncaughtExceptionHandler 示例
- 等待线程完成
- 使用 ExecutorService 取消任务
- Executor RejectedExecutionHandler
3.4. 高级并发
- ForkJoinPool 示例
- CountDownLatch 示例
- 使用信号量控制并发访问
- BinarySemaphore
- java.util.concurrent.locks.Lock
- java.util.concurrent.ThreadFactory
- ThreadLocal 变量
- 线程间通信
3.5. 并发集合
3.6. Project Loom
3.7. 杂项
祝您学习愉快!!