- 浏览: 149469 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
EclipseEye:
fair_jm 写道不错 蛮详细的 谢谢分享
SWT/JFace专题 --- SWT中Display和多线程 -
fair_jm:
不错 蛮详细的 谢谢分享
SWT/JFace专题 --- SWT中Display和多线程
使用开源软件构建并发应用程序
----------------------------------
1 开源软件Amino介绍
Amino是Apache旗下的开源软件。读者可以访问http://amino-cbbs.sourceforge.net/得到其
最新版本。
Amino Java 类库将提供优化后的并发线程组件,适用于JDK6.0 及其以后的版本。
Amino Java 类库将涉及下面四个方面的内容:
1) 数据结构
该组件将提供一套免锁的集合类。因为这些数据结构采用免锁的运算法则来生成,所
以,它们将拥有基本的免锁组件的特性,如可以避免不同类型的死锁,不同类型的线程初始
化顺序等。
2) 并行模式
Amino 将为应用程序提供一个或几个大家熟知的并行计算模式。采用这些并行模式可
以使开发者起到事半功倍的效果,这些模式包括 Master-Worker、Map-reduce、Divide and
conquer, Pipeline 等,线程调度程序可以与这些模式类协同工作,提供了开发效率。
3) 并行计算中的一般功能
Amino 将为应用程序提供并行计算中常用的方法,例如:
a. String、Sequence 和Array 的处理方面。如Sort、Search、Merge、Rank、Compare、
Reverse、 Shuffle、Rotate 和Median 等
4)原子和STM(软件事务内存模型)
--------------------------------
在Amino 类库中,主要算法将使用锁无关的(Lock-Free)的数据结构。
原语Compare-and-swap(CAS) 是实现锁无关数据结构的通用原语。CAS 可以原子
地比较一个内存位置的内容及一个期望值,如果两者相同,则用一个指定值取替这个内存位
罝里的内容,并且提供结果指示这个操作是否成功。
CAS 操作过程是:当处理器要更新一个内存位置的值的时候,它首
先将目前内存位置的值与它所知道的修改前的值进行对比(要知道在多处理的时候,你要更
新的内存位置上的值有可能被其他处理更新过,而你全然不知),如果内存位置目前的值与
期望的原值相同(说明没有被其他处理更新过),那么就将新的值写入内存位置;而如果不
同(说明有其他处理在我不知情的情况下改过这的值咯),那么就什么也不做,不写入新的
值(现在最新的做法是定义内存值的版本号,根据版本号的改变来判断内存值是否被修改,
一般情况下,比较内存值的做法已经满足要求了)。CAS 的价值所在就在于它是在硬件级别
实现的,速度那是相当的快。
========================================================================================
IBM 提供的MTRAT 工具 可以收集程序的运行时信息,实时分析程序中所有可能的并行程序错误(如死锁、数据冲突)。
多线程运行时分析工具(Multi-ThreadRun-timeAnalysisTool,MTRAT)是由 IBM 开发的一个即高效又准确的动态分析工具,它可以查找出多线程程序中的潜在的数据竞争和死锁。该工具通过修改程序的字节码,来收集为了检查死锁和数据竞争的程序的运行时信息。被修改过的程序在执行的过程中,会产生一些事件,这些事件会被MTRAT 精巧设计的数据竞争检测和死锁检测算法分析。
MTRAT 把不同的技术集成到了一个单一的开发工具中,避免了用户使用的复杂性,使得MTRAT 方便使用。MTRAT 主要由以下部分组成:
-- 简单的命令行界面和Eclipse 插件。输出MTRAT 检查到的并行错误。
-- 动态的Java 字节码修改引擎。可以在Java 类文件被Java 虚拟机加载的时候,修改Java 类。
-- 程序运行时信息收集器。收集程序的动态信息,比如内存访问,线程同步,创建和结束。
-- 高效的运行时分析引擎。收集到的运行时信息会被在线分析,如果发现潜在的并行错误,将会通过界面报告给用户。
1 锁与数据冲突
synchronized & Lock
2 采用原子性操作避免数据冲突
java.util.concurrent.atomic 包中提供了原子变量的 9 种风格( AtomicInteger; AtomicLong;
AtomicReference; AtomicBoolean;原子整型;长型;引用;及原子标记引用和戳记引用类
的数组形式;其原子地更新一对值)。
3 采用Volatile避免数据冲突
volatile 变量可以被看作是一种“程度较轻的synchronized”;
与synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分.
锁提供了两种主要特性:互斥(mutualexclusion)和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的——如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式
(Invariants)的类。
在有限的一些情形下可以使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
1)对变量的写操作不依赖于当前值。
2)该变量没有包含在具有其他变量的不变式中
这些条件表明,可以被写入volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。
第一个条件的限制使 volatile 变量不能用作线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而volatile 不能提供必须的原子特性。实现正确的操作需要使x 的值在操作期间保持不变,而volatile 变量无法实现这点。
volatile 操作不会像锁一样造成阻塞,因此,在能够安全使用volatile 的情况下,volatile可以提供一些优于锁的可伸缩特性。如果读操作的次数要远远超过写操作,与锁相比,volatile变量通常能够减少同步的性能开销。
可结合使用volatile 和synchronized 实现“开销较低的读-写锁” 。
4 ThreadLocal
其实,ThreadLocal
并不是一个Thread,而是Thread 的局部变量。当使用ThreadLocal 维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。而ThreadLocal 则从另一个角度来解决多线程的并发访问。ThreadLocal 会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal 提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
===================================================
使用阻塞队列的生产者-消费者模式 (线程间协作)
---------------------------------------
在实际应用中,多个线程之间不仅需要互斥机制来保证对共享数据的完整性,而且有时需要多个线程之间互相协作,按照某种既定的步骤来共同完成任务。一个典型的应用是称之为生产-消费者模型。
----------------------------------
1 开源软件Amino介绍
Amino是Apache旗下的开源软件。读者可以访问http://amino-cbbs.sourceforge.net/得到其
最新版本。
Amino Java 类库将提供优化后的并发线程组件,适用于JDK6.0 及其以后的版本。
Amino Java 类库将涉及下面四个方面的内容:
1) 数据结构
该组件将提供一套免锁的集合类。因为这些数据结构采用免锁的运算法则来生成,所
以,它们将拥有基本的免锁组件的特性,如可以避免不同类型的死锁,不同类型的线程初始
化顺序等。
2) 并行模式
Amino 将为应用程序提供一个或几个大家熟知的并行计算模式。采用这些并行模式可
以使开发者起到事半功倍的效果,这些模式包括 Master-Worker、Map-reduce、Divide and
conquer, Pipeline 等,线程调度程序可以与这些模式类协同工作,提供了开发效率。
3) 并行计算中的一般功能
Amino 将为应用程序提供并行计算中常用的方法,例如:
a. String、Sequence 和Array 的处理方面。如Sort、Search、Merge、Rank、Compare、
Reverse、 Shuffle、Rotate 和Median 等
4)原子和STM(软件事务内存模型)
--------------------------------
在Amino 类库中,主要算法将使用锁无关的(Lock-Free)的数据结构。
原语Compare-and-swap(CAS) 是实现锁无关数据结构的通用原语。CAS 可以原子
地比较一个内存位置的内容及一个期望值,如果两者相同,则用一个指定值取替这个内存位
罝里的内容,并且提供结果指示这个操作是否成功。
CAS 操作过程是:当处理器要更新一个内存位置的值的时候,它首
先将目前内存位置的值与它所知道的修改前的值进行对比(要知道在多处理的时候,你要更
新的内存位置上的值有可能被其他处理更新过,而你全然不知),如果内存位置目前的值与
期望的原值相同(说明没有被其他处理更新过),那么就将新的值写入内存位置;而如果不
同(说明有其他处理在我不知情的情况下改过这的值咯),那么就什么也不做,不写入新的
值(现在最新的做法是定义内存值的版本号,根据版本号的改变来判断内存值是否被修改,
一般情况下,比较内存值的做法已经满足要求了)。CAS 的价值所在就在于它是在硬件级别
实现的,速度那是相当的快。
========================================================================================
IBM 提供的MTRAT 工具 可以收集程序的运行时信息,实时分析程序中所有可能的并行程序错误(如死锁、数据冲突)。
多线程运行时分析工具(Multi-ThreadRun-timeAnalysisTool,MTRAT)是由 IBM 开发的一个即高效又准确的动态分析工具,它可以查找出多线程程序中的潜在的数据竞争和死锁。该工具通过修改程序的字节码,来收集为了检查死锁和数据竞争的程序的运行时信息。被修改过的程序在执行的过程中,会产生一些事件,这些事件会被MTRAT 精巧设计的数据竞争检测和死锁检测算法分析。
MTRAT 把不同的技术集成到了一个单一的开发工具中,避免了用户使用的复杂性,使得MTRAT 方便使用。MTRAT 主要由以下部分组成:
-- 简单的命令行界面和Eclipse 插件。输出MTRAT 检查到的并行错误。
-- 动态的Java 字节码修改引擎。可以在Java 类文件被Java 虚拟机加载的时候,修改Java 类。
-- 程序运行时信息收集器。收集程序的动态信息,比如内存访问,线程同步,创建和结束。
-- 高效的运行时分析引擎。收集到的运行时信息会被在线分析,如果发现潜在的并行错误,将会通过界面报告给用户。
1 锁与数据冲突
synchronized & Lock
2 采用原子性操作避免数据冲突
java.util.concurrent.atomic 包中提供了原子变量的 9 种风格( AtomicInteger; AtomicLong;
AtomicReference; AtomicBoolean;原子整型;长型;引用;及原子标记引用和戳记引用类
的数组形式;其原子地更新一对值)。
3 采用Volatile避免数据冲突
volatile 变量可以被看作是一种“程度较轻的synchronized”;
与synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分.
锁提供了两种主要特性:互斥(mutualexclusion)和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的——如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。
Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式
(Invariants)的类。
在有限的一些情形下可以使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
1)对变量的写操作不依赖于当前值。
2)该变量没有包含在具有其他变量的不变式中
这些条件表明,可以被写入volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。
第一个条件的限制使 volatile 变量不能用作线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而volatile 不能提供必须的原子特性。实现正确的操作需要使x 的值在操作期间保持不变,而volatile 变量无法实现这点。
volatile 操作不会像锁一样造成阻塞,因此,在能够安全使用volatile 的情况下,volatile可以提供一些优于锁的可伸缩特性。如果读操作的次数要远远超过写操作,与锁相比,volatile变量通常能够减少同步的性能开销。
可结合使用volatile 和synchronized 实现“开销较低的读-写锁” 。
4 ThreadLocal
其实,ThreadLocal
并不是一个Thread,而是Thread 的局部变量。当使用ThreadLocal 维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。而ThreadLocal 则从另一个角度来解决多线程的并发访问。ThreadLocal 会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal 提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
===================================================
使用阻塞队列的生产者-消费者模式 (线程间协作)
---------------------------------------
在实际应用中,多个线程之间不仅需要互斥机制来保证对共享数据的完整性,而且有时需要多个线程之间互相协作,按照某种既定的步骤来共同完成任务。一个典型的应用是称之为生产-消费者模型。
发表评论
-
Nio Socket
2013-05-16 05:53 0asfda -
结合jdk源码解读,Error Exception
2013-05-10 04:00 0/* * @(#)Error.java 1.17 05/11 ... -
从不同的角度,重新审视class和interface
2013-05-07 03:40 0java开发中,对应class和interface的基本区别都 ... -
java.lang.Object
2013-05-07 03:35 0/* * @(#)Object.java 1.73 06/0 ... -
反射机制+类加载机制
2013-02-18 01:30 0反射机制+类加载机制 -
Eclipse Job并发框架专题
2013-02-18 00:43 01并发性架构 2使用作业 3用户交互选项 4作业的冲突管 ... -
并发专题 ---- 线程安全
2013-02-14 00:50 747线程安全 ================== ... -
并发专题 --- 锁
2013-02-14 00:50 802相比于synchronized,ReentrantLock 提 ... -
并发专题 ----(JMM)java内存模型
2013-02-14 00:50 535Java 内存模型 ------------ ... -
并发专题 ---java.util.concurrent 包
2013-02-13 02:26 1832java.util.concurrent 包 原 ... -
并发专题---并发基础概念
2013-02-13 02:26 576进程VS程序 --进程是执行程序的动态过程,而程序是进程运行的 ... -
集合框架 Queue篇(8)---PriorityBlockingQueue、SynchronousQueue
2013-02-07 12:40 1308Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(7)---LinkedBlockingDeque
2013-02-07 12:40 850Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(6)---LinkedBlockingQueue
2013-02-07 12:39 827Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(5)---ArrayBlockingQueue
2013-02-06 10:39 701Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(4)---阻塞队列和生产者-消费者模式、DelayQueue
2013-02-06 10:39 994Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(3)---ConcurrentLinkedQueue
2013-02-06 10:38 1044Queue ------------ 1.ArrayDequ ... -
集合框架 Queue篇(2)---PriorityQueue
2013-02-06 10:38 831Queue ------------ 1.ArrayDeq ... -
集合框架 Queue篇(1)---ArrayDeque
2013-02-06 10:38 927Queue ------------ 1.ArrayDeq ... -
集合框架 Set篇---HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipList
2013-02-05 08:43 1480Set --------- 1.HashSet 2.Link ...
相关推荐
本文档讲述了Java并发编程实践,特别是使用开源软件Amino构建并发应用程序。Amino是一个开源软件,具有可操作性、跨平台性、无锁数据结构等特点,适用于多核操作系统。下面是本文档的知识点摘要: 一、Amino简介 ...
java并发编程1-9,可解压,并发编程必看资料。 1 Java 并发编程实践基础 ...4 使用开源软件 Amino 构建并发应用程序 5 数据冲突及诊断工具MTRAT 6 死锁 7 显示锁 ReentrantLock 8 原子变量与非阻塞算法 9 Java 内存模型
Amino框架是Java并发编程的一个工具,旨在简化多线程编程,提高程序的效率和可维护性。本篇文章将深入探讨Amino框架的核心概念、功能以及如何在实际项目中应用。 首先,Amino框架提供了一种高级别的抽象,使得...
无锁并行框架Amino,也被称为Concurrent Building Blocks,是一种高效、低延迟的并行编程工具,旨在帮助开发者在多核处理器...对于希望构建高性能并发应用的IT专业人士而言,理解和掌握Amino无疑会增强他们的专业能力。
名称:Amino Live CSS Editor ---------------------------------------- 版本:4.0.6 作者:https://aminoeditor.com/ 分类:开发者工具 ---------------------------------------- 概述:使用实时CSS编辑器Amino...
Amino.py库可能为开发者提供了与Amino API交互的工具,帮助他们开发与Amino社区集成的应用程序或脚本。 **使用说明.txt:** 这个文件很可能是压缩包的使用指南,包含了如何安装和使用Amino.py库的详细步骤。通常,...
标题"Amino.py-1.2.9-py3-none-any.whl.zip"表明这是一个Python相关的软件包,且已经过压缩处理。"Amino.py"可能是该软件包的主要模块或库,版本号为1.2.9,适用于Python 3解释器,而".whl"后缀则表示这是一个Python...
标题"Amino.py-1.2.0-py3-none-any.whl.zip"表明这是一个与Python相关...如果Amino.py是一个公开的项目,那么用户还可以在Python Package Index (PyPI)或其他开源平台找到更多关于它的信息,如源代码、文档和社区支持。
Wheel 文件以 .whl 为扩展名,是预先构建的二进制包,可以使用 pip 直接安装,避免了编译步骤,这对于跨平台和多架构环境尤其有用。 在压缩包内,我们有两个文件: 1. **使用说明.txt** - 这通常包含软件包的安装...
"py3"表示这个包是为Python 3编写的,"none"表示它不针对特定的平台或ABI(应用程序二进制接口),"any"则表示它可以在任何支持的平台上运行。 了解这些基本信息后,我们可以深入到"Amino.py"这个模块中。根据名称...
`.whl`是Python的 Wheel 格式,是一种预编译的Python软件分发包,它允许用户无需构建环境即可安装Python包。 描述中的"Amino.py-1.1.6-py3-none-any.whl.zip"同样强调了这个压缩包的内容,即一个特定版本(1.1.6)...
标题"Amino.py-1.2.8-py3-none-any.whl.zip"表明这是一个与Python相关的库文件,名为"Amino.py",版本号为1.2.8,它被打包成一个wheel(whl)格式的文件,适用于Python 3环境,且不依赖于特定的系统架构(none-any)...
描述 "Amino.py-1.2.7.1-py3-none-any.whl.zip" 简单地重复了标题,没有提供额外的信息,但我们可以推测 Amino.py 是一个与 Amino 相关的 Python 库,可能用于处理 Amino 社区数据、分析、或是与之相关的开发工作。...
这个库可能提供了一些关于Amino(可能是某种化学或生物学相关领域)的功能,比如数据处理、分析或其他特定的工具。 综上所述,这个压缩包包含了一个Python库Amino.py的1.2.2版本,它是用Python 3编写的,并以Wheel...
这个文件可以使用Python的包管理工具pip进行安装,命令可能是`pip install Amino.py-1.2.11.4-py3-none-any.whl`。在安装时,pip会自动处理依赖关系,确保所有必要的库都已安装。 关于Python的wheel包,它们有几个...