参考答案:
线程安全是指多个线程并发执行时,程序的行为是正确的,即使它们共享同一个资源或对象。线程安全的代码能够保证在多线程环境下,不会发生数据竞争或不一致的结果。
数据竞争:
原子性:
++ 操作不是原子性的,但通过锁或原子类(如 AtomicInteger)可以实现原子性。可见性:
volatile 关键字、synchronized 或其他同步机制。有序性:
synchronized、Lock 或其他机制来确保代码的有序性。使用 synchronized 关键字:
synchronized 用于修饰方法或代码块,保证同一时刻只有一个线程能够访问被保护的资源。1public synchronized void increment() { 2 count++; 3}
使用显式锁(Lock):
java.util.concurrent.locks.Lock 接口及其实现(如 ReentrantLock),可以提供比 synchronized 更灵活的锁机制。1Lock lock = new ReentrantLock(); 2lock.lock(); 3try { 4 count++; 5} finally { 6 lock.unlock(); 7}
使用原子变量类(java.util.concurrent.atomic 包):
AtomicInteger, AtomicLong 等类提供了原子性的操作,可以避免使用锁来确保线程安全。1AtomicInteger atomicCount = new AtomicInteger(0); 2atomicCount.incrementAndGet();
使用 volatile 关键字:
volatile 用于修饰共享变量,确保变量的修改对所有线程立即可见,避免缓存问题。1private volatile boolean flag;
使用线程安全的数据结构:
ConcurrentHashMap, CopyOnWriteArrayList),可以避免在并发环境中显式同步。不可变对象:
1public class Counter { 2 private int count = 0; 3 4 public synchronized void increment() { 5 count++; 6 } 7 8 public synchronized int getCount() { 9 return count; 10 } 11}
上面的 Counter 类通过 synchronized 确保每次只有一个线程可以修改 count,从而保证线程安全。
最近更新时间:2024-12-06