Java 中的并发(Concurrency) 指多个任务在同一时间段内交替执行(宏观上同时进行,微观上可能是 CPU 快速切换调度),目的是提高程序效率,充分利用系统资源(如 CPU、内存、I/O 等)。
Java 提供了多种并发编程工具,核心是通过线程实现:
Thread 类:重写 run() 方法定义任务,调用 start() 启动线程。 Runnable 接口:定义任务逻辑,通过 Thread 类包装并启动(推荐,避免单继承限制)。 Callable 接口:与 Runnable 类似,但可返回结果并抛出异常,配合 Future 获取结果。// Callable 示例
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 1. 定义任务(有返回值)
Callable<Integer> task = () -> {
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
return sum;
};
// 2. 包装任务
FutureTask<Integer> futureTask = new FutureTask<>(task);
// 3. 启动线程
new Thread(futureTask).start();
// 4. 获取结果(会阻塞直到任务完成)
System.out.println("1-100的和:" + futureTask.get()); // 输出5050
}
}频繁创建/销毁线程会消耗资源,线程池通过复用线程提高效率,是生产环境的首选。
Java 提供 Executors 工具类快速创建线程池:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolDemo {
public static void main(String[] args) {
// 创建固定大小的线程池(3个线程)
ExecutorService pool = Executors.newFixedThreadPool(3);
// 提交5个任务(线程池会复用3个线程处理)
for (int i = 0; i < 5; i++) {
int taskId = i;
pool.submit(() -> {
System.out.println("处理任务" + taskId + ",线程:" + Thread.currentThread().getName());
});
}
// 关闭线程池
pool.shutdown();
}
}并发虽提高效率,但多线程共享资源时会引发问题:
当多个线程同时操作共享数据(如全局变量、集合),可能导致数据不一致。
示例:两个线程同时对变量 count 做 ++ 操作,预期结果为 2,实际可能为 1(因 ++ 是多步操作,可能被打断)。
synchronized 关键字:通过“锁”保证同一时间只有一个线程执行临界区代码(修饰方法或代码块)。 public class SynchronizedDemo {
private static int count = 0;
private static final Object lock = new Object(); // 锁对象
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
synchronized (lock) { // 同步代码块:同一时间只有一个线程进入
count++;
}
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
synchronized (lock) {
count++;
}
}
});
t1.start();
t2.start();
t1.join(); // 等待线程执行完毕
t2.join();
System.out.println("count最终值:" + count); // 正确输出20000
}
}java.util.concurrent 工具类:提供线程安全的集合(如 ConcurrentHashMap)、原子类(如 AtomicInteger)、锁机制(如 ReentrantLock)等,比 synchronized 更灵活。volatile 关键字(保证变量修改后立即刷新到主内存)。count++ 实际是“读-改-写”三步,非原子操作)。undefined解决方案:synchronized、原子类(AtomicInteger)。volatile、synchronized 或显式内存屏障。java.util.concurrent 包的工具类(如 CountDownLatch、Semaphore)简化开发。理解并发是 Java 进阶的关键,尤其在高并发场景(如分布式系统、高流量服务器)中,合理设计并发模型能显著提升系统性能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。