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 关键字修饰。

Java 并发 —— Java 标准库对并发的支持及 java.util.concurrent 包的更多相关文章

  1. 【并发编程】【JDK源码】JDK的(J.U.C)java.util.concurrent包结构

    本文从JDK源码包中截取出concurrent包的所有类,对该包整体结构进行一个概述. 在JDK1.5之前,Java中要进行并发编程时,通常需要由程序员独立完成代码实现.当然也有一些开源的框架提供了这 ...

  2. 高并发编程基础(java.util.concurrent包常见类基础)

    JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法 ...

  3. 线程并发线程安全介绍及java.util.concurrent包下类介绍

    线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多! 首先开启一个线程三种方式 ①new Thread(Runnable).start() ②thread.start(); ...

  4. 深入理解java:2.3. 并发编程 java.util.concurrent包

    JUC java.util.concurrent包, 这个包是从JDK1.5开始引入的,在此之前,这个包独立存在着,它是由Doug Lea开发的,名字叫backport-util-concurrent ...

  5. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

  6. java.util.concurrent包

    在JavaSE5中,JUC(java.util.concurrent)包出现了 在java.util.concurrent包及其子包中,有了很多好玩的新东西: 1.执行器的概念和线程池的实现.Exec ...

  7. 《java.util.concurrent 包源码阅读》 结束语

    <java.util.concurrent 包源码阅读>系列文章已经全部写完了.开始的几篇文章是根据自己的读书笔记整理出来的(当时只阅读了部分的源代码),后面的大部分都是一边读源代码,一边 ...

  8. 《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包

    Aomic数据类型有四种类型:AomicBoolean, AomicInteger, AomicLong, 和AomicReferrence(针对Object的)以及它们的数组类型, 还有一个特殊的A ...

  9. 《java.util.concurrent 包源码阅读》04 ConcurrentMap

    Java集合框架中的Map类型的数据结构是非线程安全,在多线程环境中使用时需要手动进行线程同步.因此在java.util.concurrent包中提供了一个线程安全版本的Map类型数据结构:Concu ...

  10. 《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分

    这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int ...

随机推荐

  1. JS批量获取参数构建JSON参数对象

    在做系统的时候,往往查询条件是被严格指定的,大量的查询条件,一两个页面还可以通过dom去一个一个获取,再构建参数对象,请求后台接口. 这里给大家讲一个批量获取前端参数,构建参数对象. <form ...

  2. Android应用的电量消耗和优化的策略

     对于Android移动应用的开发者来说,耗电量的控制一直是个老大难问题.      我们想要控制耗电量,必须要有工具或者方法比较准确的定位应用的耗电情况.下面,我们先来分析下如何计算android应 ...

  3. ServletContext读取配置文件

    package servlet; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStrea ...

  4. 黑名单机制来临,你的应用还好么?Android P DP2最新兼容性报告出炉

    5月9日,谷歌面向全球开发者发布了 Android P Beta,即 Android P DP2. 华为终端开放实验室第一时间对TOP1000主流应用兼容性进行测试,那么在版本兼容性方面各主流应用有何 ...

  5. 【Selenium + Python】路径报错之OSError: [Errno 22] Invalid argument: './t/report/2018-03-23_11:03:12_report.html'

    现象: 此问题真的是太痛苦了,查了好多资料是说路径的问题,结果还是报错,后来一点点的排查才发现原来是!!!!!! 废话不多说上原来代码: if __name__ == '__main__': star ...

  6. CI去掉 URL 中的 index.php

    首先,你要清楚自己的 Web 服务器是 Apache,支持 mod_rewrite 查找httpd.conf中是否开启了mod_rewrite.so 然后,在 CI 根目录下新建立一个配置文件,命名为 ...

  7. Flask,ORM及模板引擎Jinja2

    跨域:http://blog.csdn.net/yannanxiu/article/details/53036508 下载flask_cors包 pip install flask-cors 使用fl ...

  8. 各种RTMP直播流播放权限_音视频_数据花屏_问题检测与分析工具EasyRTMPClient

    之前的一篇博客<网络摄像机IPCamera RTSP直播播放网络/权限/音视频数据/花屏问题检测与分析助手EasyRTSPClient>,我们介绍了RTSP流的检测和分析工具EasyRTS ...

  9. ArcGIS Overview Map(鹰眼/概览图)

    一.说明 引用文件那块,可以参考我上一篇博文,arcgis api for javascript离线部署. 这篇博文中,地图占满整个body 二.运行效果 三.HTML代码 <!DOCTYPE ...

  10. java参数的值传递和引用传递

    今天抽了点时间继续啃java核心基础,即使出来做web挺长时间了,始终觉得基础极其重要. 遇到了java参数的传递类型,豁然开朗之时不忘写下记录. java中采用的总是值传递,包括对对象参数的传递,采 ...