参考答案:
线程安全是指多个线程并发执行时,程序的行为是正确的,即使它们共享同一个资源或对象。线程安全的代码能够保证在多线程环境下,不会发生数据竞争或不一致的结果。
数据竞争:
原子性:
++
操作不是原子性的,但通过锁或原子类(如 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