对并发编程的相关总结与思考

内容包括,并发与并行,并发约束,并发下的集合类性能分析,并发相关包的概述,并发场景,并发总结

转载请注明出处:http://blog.csdn.net/supera_li/article/details/45198341

集合包

关于集合类的并发实现:

http://blog.csdn.net/supera_li/article/details/39371087

下面是接口关系

1.接口Collection->List,Set

List–>>ArrayList,LinkedList,Vector(线程安全,实现同ArrayList),Stack(继承Vector实现的LIFO)

Set–>>HashSet(基于HashMap实现),TreeSet(基于TreeMap实现)

对性能影响的2个方法:add(E),remove(E),get(int index),contains(E)

2.接口Map->HashMap(可添加null的key与values),TreeMap(红黑树实现,comparator实现的k可实现排序)

3.性能结论

单线程测试场景性能结论:List的实现随着元素数量的上升,查找和删除元素的性能下降较为严重,Set,Map影响不大。如果对于查找和删除频繁,且元素数量较多(>10^4)的应用,Set或Map是更好的选择。

多线程测试场景性能结论:相对于单线程性能都大幅度下降,元素数量级在10^3次方的时候,影响性能的因素主要取决于线程数,线程数越多,性能下降越多。

并发包

1.ConcurrentHashMap(类HashMap的并发类)

2.CopyOnWriteArrayList(在读多写少的并发场景下,比ArrayList是更好的选择)

3.CopyOnWriteArraySet(类ArraySet的并发类)

4.ArrayBlockingQueue(并发队列)

5.AtomicInteger(cpu的CAS原语实现,获得递增id并发场景使用这个)

6.ThreadPoolEXecutor(线程池对象,执行任务用的,有各种执行策略可选)

7.Executors(提供不同类型策略的ThreadPoolEXecutor创建方法)

8.FutureTask(用于调用多次只执行一次任务的连接池场景中)

9.Semaphore(控制某资源同时被访问的个数的类)

10.CountDownLatch(控制多个线程同时开始某动作的类)

11.CyclicBarrier(await数量到达的设定值后,才继续往下执行)

12.ReentrantLock(控制并发资源的类,与synchronized语法到达的效果一致)

13.Condition(并发接口,实现类有ReentrantLock,以便用户在同一个锁的情况下可以根据不同的情况执行等待或唤醒动作)

14.ReentrantReadWriteLock(该类读,写锁分离。不同于ReentrantLock一把锁)

并发约束

  1. 同步访问共享的可变数据。同步的范围应当是读与写。
  2. 避免过度同步。同步会带来性能开销
  3. Executor和task优先于线程
  4. 并发工具优先于wait和notify
  5. 线程安全性的文档化。
  6. 慎用延迟初始化。
  7. 不要依赖于线程调用器。不然程序的移植性会很差。
  8. 避免使用线程组

参考资料:

[1]并发框架Executor框架资料可参考这位博主写的:

http://www.iteye.com/topic/366591

[2]Parallelism and concurrency need different tools[并行与并发需要不同的工具]

并发(名词):指竞争或对抗。

并行:指两条直线永不相交的状态。

http://www.oschina.net/translate/parallelism-and-concurrency-need-different-tools

[3]分布式java应用 基础与实践 sun SDK库章节

[4]effective java 并发章节

[5]并发编程学习总结 引用

http://www.cnblogs.com/chgaowei/archive/2012/06/06/2538074.html

时间: 2024-08-23 23:52:50

对并发编程的相关总结与思考的相关文章

OC中并发编程的相关API和面临的挑战

OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文章出炉,2013年7月份的主题是并发编程,今天挑选其中的第2篇文章(Concurrent Programming: APIs and Challenges)进行翻译,与大家分享一下主要内容.由于内容比较多,我将分两部分翻译(API和难点)完成,翻译中,如有错误,还请指正. 目录 1.介绍 2.OS

Java并发编程 - 关于不变性的一些思考

这篇记录一下保证并发安全性的策略之——不变性. (注意:是Immutable,不是Invariant!) 将一连串行为组织为一个原子操作以保证不变性条件,或者使用同步机制保证可见性,以防止读到失效数据或者对象变为不一致状态,这些问题都是因为共享了可变的数据. 如果我们能保证数据不可变,则这些复杂的问题就自然不用去考虑了. 不可变对象一定是线程安全的. 说简单也简单,不可变对象只有一种状态,且由构造器控制. 因此,判断不可变对象的状态变得特别简单. 当我们共享一个可变对象,其状态的改变行为都是难以

关于Java并发编程的总结和思考

编写优质的并发代码是一件难度极高的事情.Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择.本文是对并发编程的一点总结和思考,同时也分享了Java5以后的版本中如何编写并发代码的一点点经验. 为什么需要并发 ??并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机)分开.这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同

关于Web开发里并发、同步、异步以及事件驱动编程的相关技术

一.开篇语 我的上篇文章<关于如何提供Web服务端并发效率的异步编程技术>又成为了博客园里“编辑推荐”的文章,这是对我写博客很大的鼓励,也许是被推荐的原因很多童鞋在这篇文章里发表了评论,有童鞋说我这篇文章理论化很严重,没有实际代码和具体项目做支撑,这个评论让我有种理论和实践脱节的味道,所以我想在这里谈谈我为什么要写这篇文章的原因,这篇文章是把我前不久学习多线程编程的一个总结. 当我从我书堆里找到所有与多线程开发相关的书籍简单阅读后,我发现了一个问题,在java里开发多线程最强有力的实践就是做服

并发编程相关知识

1.并发编程领域的关键问题 线程之间的通信 线程间的同步 1.1 线程之间的通信 线程之间的通信机制有两种,共享内存和消息传递. 在共享内存的并发模型里,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信. 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,在java中典型的消息传递方式就是wait()和notify() 1.2 线程间的同步 同步是指程序用于控制不同线程之间操作发生相对顺序的机制 2.计算机

Erlang 102 Erlang并发编程 - should be done in 2014-11-09

笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期              变更说明2014-11-02 A outline,1 Agenda 0 范围 Erlang的现实世界建模方式 Erlang进程创建 Erlang进程设计模式 Erlang进程错误处理 1 Erlang Concurrency Modeling Philosophy Armstrong在[2]中跳出程序语言在处理并发应用场景时洋洋洒洒的急迫性.跃跃欲试的一站式

多线程并发编程

前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的执行单元线程本身依靠程序进行运行线程是程序中的顺序控制流,只能使用分配给程序的资源和环境 2 进程:执行中的程序一个进程至少包含一个线程 3 单线程:程序中只存在一个线程,实际上主方法就是一个主线程 4 多线程:在一个程序中运行多个任务目的是更好地使用CPU资源 线程的实现 继承Thread类 在j

《C++ 并发编程》- 第1章 你好,C++的并发世界

<C++ 并发编程>- 第1章 你好,C++的并发世界 转载自并发编程网 – ifeve.com 本文是<C++ 并发编程>的第一章,感谢人民邮电出版社授权并发编程网发表此文,版权所有,请勿转载.该书将于近期上市. 本章主要内容 何谓并发和多线程 为什么要在应用程序中使用并发和多线程 C++并发支持的发展历程 一个简单的C++多线程程序是什么样的 这是C++用户的振奋时刻.距1998年初始的C++标准发布13年后,C++标准委员会给予程序语言和它的支持库一次重大的变革.新的C++标

伪共享(false sharing),并发编程无声的性能杀手

在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor,它被誉为“最快的消息框架”,其 LMAX 架构能够在一个线程里每秒处理 6百万 订单!在讲到 Disruptor 为什么这么快时,接触到了一个概念——伪共享( false sharing ),其中提到:缓存行上的写竞争是运行在 SMP 系统中并行线程实现可伸缩性最重要的限制因素.由于从代码中很难看