Java多线程 线程安全和并发集合
线程安全和并发集合
1. volatile 关键字
定义:volatile 是一个Java变量修饰符。它表示一个变量在任何时刻都可以被不同的线程看到。
作用:
- 保证了变量的可见性:当一个线程修改了一个
volatile变量的值,新值对于其他线程来说是立即可见的。 - 禁止指令重排序:即编译器在优化时不会改变涉及
volatile变量的执行顺序。
示例:
public class SharedResource {
private volatile boolean flag = false;
public void toggleFlag() {
flag = !flag;
}
public boolean isFlag() {
return flag;
}
}2. 原子类(如 AtomicInteger)
定义:Java的java.util.concurrent.atomic包提供了一组原子类,用于进行锁-free的原子操作。
示例:
AtomicInteger count = new AtomicInteger(0);
// Increment
count.incrementAndGet();
// Decrement
count.decrementAndGet();
// Add
count.addAndGet(5);优点:原子类能提供原子操作,但不需要使用synchronized,因此在高并发环境下性能较好。
3. 并发集合(如 ConcurrentHashMap, CopyOnWriteArrayList)
ConcurrentHashMap:
- 一个线程安全的HashMap版本。
- 使用了分段锁机制,允许多个线程并发读/写,而不需要锁定整个结构。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
int value = map.get("key");CopyOnWriteArrayList:
- 一个线程安全的List版本。
- 任何修改操作都会复制一个新的数组,读操作则总是在当前数组上进行。
- 适合读多写少的场景。
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
list.add(1);
int item = list.get(0);注意:这些并发集合虽然提高了并发性能,但也带来了额外的开销和复杂性。在选择它们之前,应该根据实际的需求和场景进行评估。
版权属于:戏人看戏博客网
本文链接:https://blog.web3er.cn/archives/1352.html
若无注明均为戏人看戏原创,转载请注明出处,感谢您的支持!