在 Java 中,多线程同步的核心目的是:保证多个线程在访问共享资源时,数据的一致性和线程安全。下面从常见方式到示例系统讲一下。
当多个线程同时读写同一个变量/对象时,可能出现:
示例问题代码:
class Counter {
int count = 0;
void increment() {
count++; // 非原子操作
}
}
多个线程调用 increment() 可能结果小于预期。
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}
class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized (lock) {
count++;
}
}
}
✅ 推荐:锁粒度更小,性能更好
private volatile boolean flag = false;
作用:
适合:
❌ 不适合 count++ 这种复合操作
import java.util.concurrent.locks.ReentrantLock;
class Counter {
private int count = 0;
private final ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
优点:
import java.util.concurrent.atomic.AtomicInteger;
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
✅ 高性能
✅ 线程安全
✅ 无锁
适合:
避免手动同步:
ConcurrentHashMap
CopyOnWriteArrayList
BlockingQueue
示例:
ExecutorService pool = Executors.newFixedThreadPool(10);
| 工具 | 作用 |
|---|---|
| CountDownLatch | 等待多个线程完成 |
| CyclicBarrier | 线程相互等待 |
| Semaphore | 控制并发数 |
| ReentrantLock | 高级锁 |
✅ 简单同步 → synchronized
✅ 高性能计数 → Atomic*
✅ 复杂控制 → Lock
✅ 数据共享 → 线程安全容器
❌ 不要过度同步(影响性能)
class SafeCounter {
private int count = 0;
public synchronized void add() {
count++;
}
public synchronized int get() {
return count;
}
}
如果你愿意,我可以:
你更想了解哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。