Java 并发 —— Java 标准库对并发的支持及 java.util.concurrent 包

0. Collections.synchronizedXxx()

Java 中常用的集合框架中的实现类:HashSet/TreeSet、ArrayList/LinkedList、HashMap/TreeMap 都不是线程安全的。即如果存在多个线程访问它们,并且有超过一个的线程试图修改它们,便存在线程安全的问题:

Collection c = Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchronizedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap());

1. 注意

使用 java.util.concurrent.*下的类并非万事大吉

ConcurrentHashMap、synchronized与线程安全

使用 hashmap 做字符串的次数统计,为保证容器的线程安全,在修改容器内容时,加锁,在java中即是通过 synchronized 的关键字实现加锁。

public class ConcurrentMapTest
{
    private HashMap<String, Integer> map = 
            new HashMap<>();

    public synchronized void add(String key)
    {
        Integer value = map.get(key);
        if (value == null)
        {
            // 也可通过 map.containsKey(key) 进行判断
            map.put(key, 1);
        }
        else
        {
            map.put(key, value+1);
        }
    }
}

如果我们使用 ConcurrentHashMap 是不是就可以避免 synchronized 关键字的使用了呢?

public class ConcurrentMapTest
{
    private ConcurrentHashMap<String, Integer> map = 
            new ConcurrentHashMap<>();

    public void add(String key)
    {
        if (!map.containsKey(key))
        {
            map.put(key, 1);
        }
        else
        {
            map.put(key, map.get(key)+1);
        }
    }
}

注意,map.put(key, map.get(key)+1) 实际上执行了至少三个原子操作:

  • map.get
  • value + 1
  • map.put

因此其 add 方法仍需被 synchronized 关键字修饰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值