同步与并发:Java的同步舞蹈
现在,我们将深入探讨同步与并发,这是确保多线程程序正确性和效率的关键,就像是Java的同步舞蹈。
1 并发的概念
并发是指在多处理器系统中,多个操作或多个线程同时进行执行。在Java中,这意味着能够有效地利用多核处理器资源,提高程序性能。
2 线程间的通信
线程间的通信主要依靠共享内存,而同步机制确保了线程在访问共享资源时的一致性和线程安全。
3 同步方法
在Java中,可以通过synchronized
关键字来同步方法,确保一次只有一个线程可以执行该方法。
示例代码:
public class SynchronizedMethod {
public synchronized void doWork() {
// 仅允许一个线程同时执行这个方法
}
}
4 同步块
同步块提供了更细粒度的控制,允许只同步代码的一部分。
示例代码:
public class SynchronizedBlock {
private final Object lock = new Object();
public void doWork() {
synchronized (lock) {
// 仅允许一个线程同时执行括号内的代码
}
}
}
5 可见性
可见性是指一个线程对共享变量的修改能够被其他线程看到。在Java中,volatile
关键字可以保证变量的可见性。
示例代码:
public class Visibility {
private volatile boolean active = true;
public void stop() {
active = false;
}
public void doWork() {
while (active) {
// 工作代码
}
}
}
6 死锁
死锁发生在两个或多个线程相互等待对方释放资源,导致程序无法继续执行。避免死锁是并发编程中的一个挑战。
7 避免死锁的策略
-
锁定顺序:总是以相同的顺序获取锁。
-
锁定超时:尝试获取锁时使用超时。
-
死锁检测:周期性地检查死锁并手动解决。
8 并发工具
Java的java.util.concurrent
包提供了多种并发工具,如CountDownLatch
、CyclicBarrier
、Semaphore
等,这些工具帮助程序员更容易地处理复杂的并发问题。
示例代码(CountDownLatch):
import java.util.concurrent.CountDownLatch;
public class LatchExample {
public static void main(String[] args) throws InterruptedException {
final int totalThreads = 5;
CountDownLatch latch = new CountDownLatch(totalThreads);
for (int i = 0; i < totalThreads; i++) {
new Thread(new Worker(latch)).start();
}
latch.await(); // 等待所有线程完成
System.out.println("All threads have finished execution");
}
static class Worker implements Runnable {
private final CountDownLatch latch;
public Worker(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
// 执行工作
} finally {
latch.countDown(); // 完成时计数减一
}
}
}
}
9 并发集合
java.util.concurrent
包还提供了线程安全的并发集合,如ConcurrentHashMap
、CopyOnWriteArrayList
等,它们为并发程序提供了高效的数据结构。
示例代码(ConcurrentHashMap):
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentMapExample {
private static ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
public static void main(String[] args) {
map.put(1, "One");
map.put(2, "Two");
// 可以安全地由多个线程访问和修改
}
}
通过这一节的学习,你现在应该对Java中的同步与并发有了深入的理解。同步与并发是确保多线程程序正确性和效率的关键,它们允许程序在多核处理器上高效运行。掌握这些概念,可以帮助你编写出既正确又高效的并发程序。下一节,我们将探讨线程池与并发工具,这是Java的分身管理器,用于管理线程的创建和执行。