# Java并發編程的基礎
## 引言
在當今多核處理器普及的時代,并發編程已成為提高程序性能的關鍵手段。Java作為一門成熟的企業級編程語言,提供了豐富的并發編程工具和API。本文將系統介紹Java并發編程的基礎知識,包括線程基礎、線程安全、同步機制以及常用并發工具類等內容。
## 一、線程基礎
### 1.1 線程與進程
- **進程**:操作系統資源分配的基本單位,擁有獨立的內存空間
- **線程**:CPU調度的基本單位,共享進程內存空間
- **關系**:一個進程包含多個線程,線程是輕量級的進程
### 1.2 線程創建方式
```java
// 方式1:繼承Thread類
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread running");
}
}
// 方式2:實現Runnable接口
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable running");
}
}
// 方式3:使用Lambda表達式
Thread lambdaThread = new Thread(() -> {
System.out.println("Lambda thread running");
});
當多個線程訪問共享資源時,可能導致數據不一致的問題,典型場景包括: - 競態條件(Race Condition) - 內存可見性問題 - 指令重排序問題
// 同步方法
public synchronized void syncMethod() {
// 臨界區代碼
}
// 同步代碼塊
public void syncBlock() {
synchronized(this) {
// 臨界區代碼
}
}
// 靜態方法同步
public static synchronized void staticSync() {
// 臨界區代碼
}
保證變量的可見性和禁止指令重排序:
private volatile boolean flag = false;
特性 | synchronized | ReentrantLock |
---|---|---|
實現方式 | JVM內置 | JDK實現 |
可中斷 | 不支持 | 支持 |
公平鎖 | 非公平 | 可配置 |
條件變量 | 有限支持 | 支持 |
性能 | 優化后較好 | 較高 |
// 初始化計數器
CountDownLatch latch = new CountDownLatch(3);
// 工作線程
new Thread(() -> {
// 執行任務
latch.countDown();
}).start();
// 主線程等待
latch.await();
System.out.println("所有任務完成");
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
System.out.println("所有線程到達屏障");
});
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
System.out.println("線程到達");
barrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
Semaphore semaphore = new Semaphore(3); // 允許3個線程同時訪問
new Thread(() -> {
try {
semaphore.acquire();
// 訪問資源
} finally {
semaphore.release();
}
}).start();
// 創建線程池
ExecutorService executor = Executors.newFixedThreadPool(5);
// 提交任務
executor.submit(() -> {
System.out.println("Task running");
});
// 關閉線程池
executor.shutdown();
new ThreadPoolExecutor(
corePoolSize, // 核心線程數
maximumPoolSize, // 最大線程數
keepAliveTime, // 空閑線程存活時間
unit, // 時間單位
workQueue, // 工作隊列
threadFactory, // 線程工廠
handler // 拒絕策略
);
AtomicInteger counter = new AtomicInteger(0);
// 原子遞增
counter.incrementAndGet();
// CAS操作
boolean success = counter.compareAndSet(expect, update);
高并發場景下性能優于AtomicLong:
LongAdder adder = new LongAdder();
adder.increment();
long sum = adder.sum();
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
map.computeIfAbsent("key", k -> 2);
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("item");
list.get(0); // 讀取不需要同步
Future<String> future = executor.submit(() -> {
Thread.sleep(1000);
return "Result";
});
String result = future.get(); // 阻塞獲取結果
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World")
.thenAccept(System.out::println);
Java并發編程是一個龐大而復雜的主題,本文僅介紹了基礎概念和常用工具。要真正掌握并發編程,需要深入理解Java內存模型(JMM),并在實際項目中不斷實踐和優化。隨著Java版本的更新,并發API也在不斷演進(如虛擬線程等),開發者需要持續學習新的技術和最佳實踐。
注意:本文示例代碼僅用于演示概念,實際使用時需要考慮異常處理、資源釋放等細節。 “`
這篇文章大約2200字,涵蓋了Java并發編程的主要基礎知識點,采用Markdown格式編寫,包含代碼示例和表格對比,結構清晰。如需進一步擴展某個主題或添加更多實踐案例,可以繼續補充相關內容。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。