Java多线程 线程安全和并发集合

技术分享
960 0

线程安全和并发集合

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);

注意:这些并发集合虽然提高了并发性能,但也带来了额外的开销和复杂性。在选择它们之前,应该根据实际的需求和场景进行评估。

最后更新 2023-09-23
评论 ( 0 )
OωO
隐私评论