怎么保证多线程安全?
synchronized关键字
:可以使用synchronized关键字来同步代码块或方法,确保同一时刻只有一个线程可以访问这些代码。对象锁是通过synchronized关键字锁定对象的监视器(monitor)来实现的。
public synchronized void someMethod ( ) { } public void anotherMethod ( ) { synchronized ( someObject) { }
}
volatile关键字
:volatile关键字用于变量,确保所有线程看到的是该变量的最新值,而不是可能存储在本地寄存器中的副本。
public volatile int sharedVariable;
Lock接口和ReentrantLock类
:java.util.concurrent.locks.Lock接口提供了比synchronized更强大的锁定机制,ReentrantLock是一个实现该接口的例子,提供了更灵活的锁管理和更高的性能。
private final ReentrantLock lock = new ReentrantLock ( ) ; public void someMethod ( ) { lock. lock ( ) ; try { } finally { lock. unlock ( ) ; }
}
原子类
:Java并发库(java.util.concurrent.atomic)提供了原子类,如AtomicInteger、AtomicLong等,这些类提供了原子操作,可以用于更新基本类型的变量而无需额外的同步。
AtomicInteger counter = new AtomicInteger ( 0 ) ;
int newValue = counter. incrementAndGet ( ) ;
线程局部变量
:ThreadLocal类可以为每个线程提供独立的变量副本,这样每个线程都拥有自己的变量,消除了竞争条件。
ThreadLocal < Integer > threadLocalVar = new ThreadLocal < > ( ) ; threadLocalVar. set ( 10 ) ;
int value = threadLocalVar. get ( ) ;
并发集合
:使用java.util.concurrent包中的线程安全集合,如ConcurrentHashMap、ConcurrentLinkedQueue等,这些集合内部已经实现了线程安全的逻辑。JUC工具类
: 使用java.util.concurrent包中的一些工具类可以用于控制线程间的同步和协作。例如:Semaphore和CyclicBarrier等。