java如何竞争
Java中的线程竞争问题
在多线程编程中,竞争条件(Race Condition)是指多个线程同时访问共享资源,且最终结果取决于线程的执行顺序。Java提供了多种机制来处理线程竞争问题。
使用synchronized关键字
synchronized关键字可以修饰方法或代码块,确保同一时间只有一个线程可以访问被保护的资源。
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
使用Lock接口
Java的java.util.concurrent.locks.Lock接口提供了更灵活的锁机制,例如ReentrantLock。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Counter {
private int count = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public int getCount() {
lock.lock();
try {
return count;
} finally {
lock.unlock();
}
}
}
使用原子类
java.util.concurrent.atomic包提供了一系列原子类(如AtomicInteger、AtomicLong),可以高效地实现线程安全的操作。
import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
使用volatile关键字
volatile关键字确保变量的修改对所有线程可见,适用于单写多读的场景,但不能完全替代锁机制。

public class SharedResource {
private volatile boolean flag = false;
public void setFlag(boolean value) {
flag = value;
}
public boolean getFlag() {
return flag;
}
}
使用线程安全的集合
Java的java.util.concurrent包提供了线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,避免手动同步。
import java.util.concurrent.ConcurrentHashMap;
public class Cache {
private ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
public void put(String key, String value) {
map.put(key, value);
}
public String get(String key) {
return map.get(key);
}
}
避免死锁
竞争条件可能导致死锁,即多个线程互相等待对方释放资源。避免死锁的策略包括:
- 按固定顺序获取锁
- 使用
tryLock设置超时 - 避免嵌套锁
public class DeadlockExample {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void method1() {
synchronized (lock1) {
synchronized (lock2) {
// Do something
}
}
}
public void method2() {
synchronized (lock2) {
synchronized (lock1) {
// Do something
}
}
}
}
使用线程池管理并发
ExecutorService框架可以有效地管理线程资源,避免频繁创建和销毁线程的开销。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
System.out.println("Task executed by " + Thread.currentThread().getName());
});
}
executor.shutdown();
}
}
总结
Java提供了多种机制处理线程竞争问题,包括synchronized、Lock、原子类、volatile以及线程安全集合。选择合适的方案取决于具体场景,同时需注意避免死锁和性能问题。






