# Java 并发教程

> 原文： [https://howtodoinjava.com/java-concurrency-tutorial/](https://howtodoinjava.com/java-concurrency-tutorial/)

简而言之，[**并发**](https://en.wikipedia.org/wiki/Concurrency_%28computer_science%29)是并行运行多个程序或程序的多个部分的能力。 并发使程序可以通过利用底层操作系统和机器硬件的未开发能力来实现高性能和吞吐量。 例如现代计算机在一个 CPU 中具有多个 CPU 或多个内核，程序可以将所有内核用于处理的某些部分； 因此，与顺序处理相比，可以更早地完成任务。

**Java 并发**的主干是线程。 线程是一个轻量级进程，它具有自己的调用栈，但可以访问同一进程中其他线程的共享数据。 Java 应用程序默认在一个进程中运行。 在 Java 应用程序中，您可以使用许多线程来实现并行处理或并发。

## 是什么使 Java 应用程序并发？

第一个类是[`java.lang.Thread`](https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html)类，您需要使一个 Java 类并发。 此类是 Java 中所有并发概念的基础。 然后，您具有[`java.lang.Runnable`](https://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html)接口，可以从线程类中抽象出线程行为。

您可以在 Java 1.5 中添加的[`java.util.concurrent`](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html)包中找到构建高级应用程序所需的其他类。

> **阅读更多：** [Java 并发演化](//howtodoinjava.com/java/multi-threading/java-multi-threading-evolution-and-topics/)

## Java 并发真的那么简单吗？

上面的描述给人的印象是并发确实是一个好概念，并且很容易实现。 好吧，不是。 它需要对基本概念有足够的了解，并且需要对应用程序目标有清晰的了解。

与单线程应用程序相比，并发应用程序通常具有更复杂的设计。 由多个线程访问共享数据执行的代码需要特别注意。 错误线程同步引起的错误很难检测，重现和修复。 它们通常在较高的环境（例如生产环境）中显示，有时在较低的环境中不可能复制错误。

除了复杂的缺陷外，并发还需要更多资源来运行应用程序。 因此，请确保您的小猫咪有足够的资源。

## Java 并发教程

在单个帖子中涵盖整个 Java 并发几乎是不可能的。 因此，我在下面的 Java 并发教程中编写了一篇文章，讨论了一个单独的概念。 浏览这些教程，如果您有任何问题或建议，请告诉我。

#### Java 并发基础

[并发演化](//howtodoinjava.com/java/multi-threading/java-multi-threading-evolution-and-topics/)

[什么是线程安全性？](//howtodoinjava.com/java/multi-threading/what-is-thread-safety/)

[对象级锁定和类级锁定](//howtodoinjava.com/java/multi-threading/thread-synchronization-object-level-locking-and-class-level-locking/)

[比较和交换（CAS）算法](//howtodoinjava.com/java/multi-threading/compare-and-swap-cas-algorithm/)

[`wait()`，`notify()`和`notifyAll()`方法](//howtodoinjava.com/java/multi-threading/how-to-work-with-wait-notify-and-notifyall-in-java/)

#### 之间的区别

[“`Runnable`实现”和“扩展线程”之间的区别](//howtodoinjava.com/java/multi-threading/difference-between-implements-runnable-and-extends-thread-in-java/)

[锁和监视器之间的区别](//howtodoinjava.com/java/multi-threading/multithreading-difference-between-lock-and-monitor/)

[`yield()`和`join()`之间的区别](//howtodoinjava.com/java/multi-threading/difference-between-yield-and-join-in-threads-in-java/) [

[`sleep()`和`wait()`之间的区别？](//howtodoinjava.com/java/multi-threading/difference-between-sleep-and-wait/)

#### 执行器框架

[执行器框架教程](//howtodoinjava.com/java-5/java-executor-framework-tutorial-and-best-practices/)

[`ScheduledThreadPoolExecutor`示例](//howtodoinjava.com/2015/03/25/task-scheduling-with-executors-scheduledthreadpoolexecutor-example/)

[`FixedSizeThreadPoolExecutor`示例](//howtodoinjava.com/java/multi-threading/java-fixed-size-thread-pool-executor-example/)

[`ThreadPoolExecutor`示例](//howtodoinjava.com/java/multi-threading/java-thread-pool-executor-example/)

[`Runnable`+`Future`的示例](//howtodoinjava.com/java/multi-threading/threadpoolexecutor-callable-future-example/)

[使用`ThreadPoolExecutor`和`Semaphore`限制任务提交率](//howtodoinjava.com/java/multi-threading/throttling-task-submission-rate-using-threadpoolexecutor-and-semaphore/)

[`BlockingQueue`示例](//howtodoinjava.com/java-5/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/)

[`UncaughtExceptionHandler`示例](//howtodoinjava.com/java/multi-threading/how-to-restart-thread-using-uncaughtexceptionhandler/)

#### 并发

[`ForkJoinPool`示例](//howtodoinjava.com/java-7/forkjoin-framework-tutorial-forkjoinpool-example/)

[`CountDownLatch`示例](//howtodoinjava.com/java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/)

[使用信号量](//howtodoinjava.com/java/multi-threading/control-concurrent-access-to-multiple-copies-of-a-resource-using-semaphore/)

[`BinarySemaphore`](//howtodoinjava.com/java/multi-threading/binary-semaphore-tutorial-and-example/)

[`Java.util.concurrent.locks.Lock`](//howtodoinjava.com/java/multi-threading/how-to-use-locks-in-java-java-util-concurrent-locks-lock-tutorial-and-example/)

[`java.util.concurrent.ThreadFactory`](//howtodoinjava.com/java/multi-threading/creating-threads-using-java-util-concurrent-threadfactory/)

[线程局部变量](//howtodoinjava.com/java/multi-threading/when-and-how-to-use-thread-local-variables/)

[线程间通信](//howtodoinjava.com/java/multi-threading/inter-thread-communication-using-piped-streams-in-java/)

#### 并发集合


[`ConcurrentHashMap`示例](//howtodoinjava.com/java/collections/best-practices-for-using-concurrenthashmap/)

[`ConcurrentLinkedDeque`示例](//howtodoinjava.com/java/multi-threading/non-blocking-thread-safe-list-concurrentlinkeddeque-example/)

#### 杂项

[创建和解决死锁](//howtodoinjava.com/java/multi-threading/writing-a-deadlock-and-resolving-in-java/)

学习愉快！