Java进阶7并发优化4——JDK并发数据结构20131114

由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以这一次并发程序的优化介绍的是并发程序中的数据结构,比如并发List,并发Set,并发Map等。

1.并发List

Vector实现的List接口,CopyOnWriteArrayList也是实现的List接口,这两个List的实现是线程安全的,但是对于ArrayList不是线程安全的,所以在多线程中尽量避免使用ArrayList,如果因为某些原因必须使用的话,需呀使用同步机制:

Collection.synchronizedList(List list)对List进行封装,封装成为线程安全的List。

CopyOnWriteArrayList:实现的机制与Vector的机制是不同的,当对对象进行写操作的时候,复制该对象;如果是进行读操作的话,那么就直接返回结果,不需要同步;核心思想就是减少所得竞争,从而提高程序的性能,但是这个数据结构在一定程度上牺牲了写的性能。

Vector的实现使用的是同步机制,get所有的操作必须是首先获得对象的锁才可以进行,在高并发的情况支架,锁机制会拖累系统性能。

Vector适合写操作,CopyOnWriteArrrayList适合的是读操作并发程序

2.并发Set

类似List,Set 也有一个CopyOnWriteArraySet,而且是线程安全的,内部实现完全依赖于CopyOnWriteArrayList,适合使用在读操作多的并发场景,当然也可以使用的是

Collections中的静态方法将数据结构转换成为线程安全的。

public static <T> Set<T> synchronizedSet(Set<T> s);

3.并发Map

同样可以使用Collectionsz中的synchornizedMap()方法转换,但是性能比较差,JDK中提供了一个比较高效的Map数据结构:ConcurrrentHashMap.他的get是无锁的,他的put的锁粒度是比较小的,所以效率会比较高。

4.并发Queue

JDK中有两种代表性的实现:ConcurrentLinkedQueue为代表的高性能队列和BlockingQueue为接口的阻塞队列,都是集成Queue接口。

ConcurrentLinkedQueue适合的是高并发场景的队列,通过无锁的方式实现的,而且性能是高于BlockingQueue。

5.并发Deque

在JDK中实现了双端队列,可以在头部和尾部实现出队和入队,他有三个实现类:LinkedList,ArrayDeque, LinkedBlockingDeque。它们都实现了双端队列的接口 Deque。ArrayDeque是基于Array实现的,拥有高效的随机访问性质,但是当队列变大的时候,就需要重新分配内存空间,并且才需要复制数值;所以LinkedList会表现出更好的性能。以上两者都不是线程安全的。

需要使用LinkedBlockingDeque,这是一个线程安全的Deque的实现,他没有实现读写锁的分离,所以高并发系统中性能是地狱LinkedBlockingQueue的。

Tengfei Yang

In Sun Yat-sen University 2013.11.14

Java进阶7并发优化4——JDK并发数据结构的更多相关文章

  1. Java 进阶7 并行优化 JDK多任务执行框架技术

    Java 进阶7 并行优化 JDK多任务执行框架技术 20131114          Java 语言本身就是支持多线程机制的,他提供了 Thread 类 Runnable 接口等简单的多线程支持工 ...

  2. 项目四:Java秒杀系统方案优化-高性能高并发实战

    技术栈 前端:Thymeleaf.Bootstrap.JQuery 后端:SpringBoot.JSR303.MyBatis 中间件:RabbitMQ.Redis.Druid 功能模块 分布式会话,商 ...

  3. Java秒杀系统方案优化 高性能高并发实战(1)

    首先先把 springboot +thymeleaf 搞起来 ,参考 springboot 官方文档 本次学习 使用 springboot + thymeleaf+mybatis+redis+Rabb ...

  4. Java秒杀系统方案优化 高性能高并发实战(已完成)

    1:商品列表 2:商品详情判断是否可以开始秒杀,未开始不显示秒杀按钮显示倒计时,开始显示秒杀按钮,同时会显示验证码输入框以及验证码图片,当点击秒杀按钮的时候会首先判断验证码是否正确,如果正确会返回一个 ...

  5. Java 进阶7 并发优化 5 并发控制板方法

    Java 进阶7 并发优化 5 并发控制板方法 20131114 前言:          Java 中多线程并发程序中存在线程安全的问题,之前学习 Java的同步机制,掌握的同步方法只有一种就是使用 ...

  6. Java进阶7 并发优化2 并行程序设计模式

    Java进阶7 并发优化2 并行程序设计模式20131114 1.Master-worker模式 前面讲解了Future模式,并且使用了简单的FutureTask来实现并发中的Future模式.下面介 ...

  7. Java高并发秒杀API之高并发优化

    ---恢复内容开始--- 第1章 秒杀系统高并发优化分析   1.为什么要单独获得系统时间 访问cdn这些静态资源不用请求系统服务器 而CDN上没有系统时间,需要单独获取,获取系统时间不用优化,只是n ...

  8. Java进阶知识点:并发容器背后的设计理念

    一.背景 容器是Java编程中使用频率很高的组件,但Java默认提供的基本容器(ArrayList,HashMap等)均不是线程安全的.当容器和多线程并发编程相遇时,程序员又该何去何从呢? 通常有两种 ...

  9. Java进阶知识点:服务端高并发的基石 - NIO与Reactor AIO与Proactor

    一.背景 要提升服务器的并发处理能力,通常有两大方向的思路. 1.系统架构层面.比如负载均衡.多级缓存.单元化部署等等. 2.单节点优化层面.比如修复代码级别的性能Bug.JVM参数调优.IO优化等等 ...

随机推荐

  1. SQL学习笔记之MySQL索引知识点

    0x00 概述 之前写过一篇Mysql B+树学习,简单的介绍了B+数以及MySql使用B+树的原因, 有了这些基础知识点,对MySql索引的类型以及索引使用的一些技巧,就比较容易理解了. 0x01 ...

  2. 关于Linq翻译Inner join ,Left join (本文为转载)

    我們先來一段最基本的 LINQ to SQL 使用類似 T-SQL 的 INNER JOIN 資料查詢語法: from c in Categories from o in c.Products sel ...

  3. spring cloud要点简介及常用组件

    spring cloud基于spring boot spring cloud是通过包装其他技术框架实现的,例如OSS组件,实现了一套通过基于注解.java配置和基于模板开发的微服务框架. spring ...

  4. linux消息队列应用编程

    消息队列:  消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法   每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值   消息队列也有管道一样的不足,就是每个消息的 ...

  5. excel省市区三级分类级联

    前言:同事正好需要一个这样的地址类型给用户使用下载模板,改好地址再导入,这样就不会出现地址不匹配问题.所以就自己也整理了一套,以备不时之需. 效果展示: 图一:省级 图二:市级 图三:区级 图四:各乡 ...

  6. [BZOJ3124]直径

    Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一 ...

  7. Linux 下 YUM 安装 PHP 5.5 (及5.6)

    原文链接: http://blog.aboutc.net/linux/50/yum-install-php-on-linux 系统环境: CentOS 6.4 x86_64 Fedora 20 x86 ...

  8. maven打包pom.xml备忘

    打包生成可执行jar 包 POM.XML <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...

  9. SpringMVC封装表单数据

    1.domain类 package com.xiaostudy.domain; public class User { private int id; private String username; ...

  10. python x[:] x[::]用法总结

    python x[:] x[::]用法总结 X[:,0] # 二维数组取第1维所有数据 X[:,1] # 第2列 X[0,:] # 第1行 X[3,:] # 第三行 X[1:4,:] # 第一二三行 ...