Amino框架是一个采用无锁方式实现并行计算的框架,可惜的是,网上关于Amino框架的介绍甚少。根据所掌握的资料,稍微总结一下:

1. 锁机制到无锁机制

锁机制可以确保程序和数据的线程安全,但是锁是一种阻塞式的同步方式,无论是ReentrantLock、synchronized,还是Semaphore,都受到核心资源的限制。为避免这个问题,便提出了无锁的同步机制。
 

2. 基于Compare-and-swap(CAS) 算法的无锁并发控制方法

CAS算法过程是:它包含三个参数CAS(V,E,N),V表示内存位置目前的值,E表示期望的原值,N表示新值。当处理器要更新一个内存位置的值的时候,它首先将V与E进行对比(要知道在多处理的时候,你要更新的内存位置上的值V有可能被其他处理更新过,而你全然不知),如果V与E相同,那么就将V设为N,将N写入内存;否则,就什么也不做,不写入新的值(现在最新的做法是定义内存值的版本号,根据版本号的改变来判断内存值是否被修改)。CAS 的价值所在就在于它是在硬件级别实现的,速度那是相当的快。
这种无锁并发控制方法像极了乐观锁。
 
在JDK的java.util.concurrent.atomic包下,有一组使用无锁方式实现的原子操作,包括AtomicInteger、AtomicIntegerArray、AtomicLong、AtomicLongArray等。以AtomicInteger为例,其中的getAndSet()方法是这样实现CAS的:
 
  1. public final int getAndSet(int newValue){
  2. for(;;){
  3. int current=get();
  4. if(compareAndSet(current,newValue))
  5. return current;
  6. }
  7. }
 

3. 引出Amino框架

该组件将提供一套免锁的集合类(LockFreeVector、LockFreeList、LockFreeSet等)、树结构、图结构。因为这些数据结构采用免锁的运算法则来生成,所以,它们将拥有基本的免锁组件的特性,如可以避免不同类型的死锁,不同类型的线程初始化顺序等。 
 
Amino 还提供了一些非常有用的并行计算模式,包括 Master-Worker、Map-reduce、Divide and conquer, Pipeline 等。 
 
Amino并没有加入到官方jdk中,因此需要自行下载、导入。
下载地址:http://sourceforge.net/projects/amino-cbbs/files/
 

4. 性能测试

下面,在64位4G内存的Windows7测试下Vector与LockFreeVector、CopyOnWriteArrayList与LockFreeList在增加、删除操作的区别。从结果可以看出,后者性能大大提升。
 
测试代码:
  1. public class CopyList {
  2. public static void test1(AccessListTread t, String name){
  3. CounterPoolExecutor exe0=new CounterPoolExecutor(2000,2000,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
  4. exe0.TASK_COUNT=8000;
  5. exe0.funcname=name;
  6. exe0.startTime=System.currentTimeMillis();
  7. for(int i=0;i<exe0.TASK_COUNT;i++)
  8. exe0.submit(t);//测试数据:8000
  9. exe0.shutdown();
  10. }
  11. public static void main(String[] args) {
  12. AccessListTread t=new AccessListTread();
  13. t.initCopyOnWriteArrayList();
  14. test1(t,"testCopyOnWriteArrayList");
  15. t.initVector();
  16. test1(t,"testVector");
  17. t.initLockFreeList();
  18. test1(t,"testLockFreeList");
  19. t.initLockFreeVector();
  20. test1(t,"testLockFreeVector");
  21. }
  22. }
  23. class CounterPoolExecutor extends ThreadPoolExecutor{
  24. public AtomicInteger count=new AtomicInteger(0);//统计次数
  25. public long startTime=0;
  26. public String funcname="";
  27. public int TASK_COUNT=0;
  28. public CounterPoolExecutor(int corePoolSize, int maximumPoolSize,
  29. long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
  30. super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
  31. }
  32. @Override
  33. protected void afterExecute(Runnable r,Throwable t){
  34. int l=count.addAndGet(1);
  35. if(l==TASK_COUNT){
  36. System.out.println(funcname+"spend time:"+(System.currentTimeMillis()-startTime));
  37. }
  38. }
  39. }
  40. class AccessListTread implements Runnable{
  41. Random rand=new Random();
  42. List list;
  43. public AccessListTread() {
  44. }
  45. @Override
  46. public void run() {
  47. try {
  48. for(int i=0;i<1000;i++)
  49. //              getList(rand.nextInt(1000));
  50. handleList(rand.nextInt(1000));
  51. Thread.sleep(rand.nextInt(100));
  52. } catch (InterruptedException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. private Object getList(int nextInt) {
  57. return list.get(nextInt);
  58. }
  59. private Object handleList(int index) {
  60. list.add(index);
  61. list.remove(index%list.size());
  62. return null;
  63. }
  64. //test
  65. public void initCopyOnWriteArrayList(){
  66. list=new CopyOnWriteArrayList();
  67. for(int i=0;i<1000;i++)
  68. list.add(i);
  69. }
  70. public void initVector(){
  71. list=new Vector();
  72. for(int i=0;i<1000;i++)
  73. list.add(i);
  74. }
  75. public void initLockFreeList(){
  76. list=new LockFreeList();
  77. for(int i=0;i<1000;i++)
  78. list.add(i);
  79. }
  80. public void initLockFreeVector(){
  81. list=new LockFreeVector();
  82. for(int i=0;i<1000;i++)
  83. list.add(i);
  84. }
  85. }

测试结果:

  1. testVectorspend time:366
  2. testCopyOnWriteArrayListspend time:717
  3. testLockFreeListspend time:541
  4. testLockFreeVectorspend time:244

Java并发编程之——Amino框架的更多相关文章

  1. Java 并发编程 -- Fork/Join 框架

    概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的 ...

  2. Java并发编程--Fork/Join框架使用

    上篇博客我们介绍了通过CyclicBarrier使线程同步,可是上述方法存在一个问题,那就是假设一个大任务跑了2个线程去完毕.假设线程2耗时比线程1多2倍.线程1完毕后必须等待线程2完毕.等待的过程线 ...

  3. Java并发编程--4.Executor框架

    简介 Executor框架是启动,管理线程的API, 它的内部实现是线程池机制,它有很多好处,比如使任务提交和任务执行解耦合,防止this逃逸:它的主要API包括: Executor,  Execut ...

  4. java并发编程-Executor框架

    Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...

  5. Java 并发编程——Executor框架和线程池原理

    Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...

  6. 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结

    <Java并发编程实战>和<Java并发编程的艺术>           Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...

  7. (转)java并发编程--Executor框架

    本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ...

  8. Java并发编程原理与实战三十二:ForkJoin框架详解

    1.Fork/Join框架有什么用呢? ------->Fork使用来切分任务,Join是用来汇总结果.举个简单的栗子:任务是1+2+3+...+100这个任务(当然这个任务的结果有好的算法去做 ...

  9. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

随机推荐

  1. Codeforces 932E Team work 【组合计数+斯特林数】

    Codeforces 932E Team work You have a team of N people. For a particular task, you can pick any non-e ...

  2. spring注解实现业务层事务管理,当业务层自调用时,事务失效问题解决

    前些日子一朋友在需要在目标对象中进行自我调用,且需要实施相应的事务定义,且网上的一种通过BeanPostProcessor的解决方案是存在问题的.因此专门写此篇帖子分析why. 1.预备知识 aop概 ...

  3. UVA11401 Triangle Counting

    题意 输入\(n\),输出有多少种方法可以从\(1,2,3,\dots,n\)中选出3个不同的整数,使得以他们为三边长可以组成三角形. \(n \leq 10^6\) 分析 参照刘汝佳的题解. 按最大 ...

  4. modsecurity3.0 nginx 安装

    备注: 使用的是modsecurity 3.0 的版本,也是nginx 官方推荐使用的,同时使用的是nginx 的dynamic module 1. 环境准备 https://github.com/S ...

  5. (转)Maven的pom.xml文件结构之Build配置build

    在Maven的pom.xml文件中,Build相关配置包含两个部分,一个是<build>,另一个是<reporting>,这里我们只介绍<build>. 1. 在M ...

  6. 在ng中的select的使用方法的讲解

    项目中我们可能会使用到条件过滤选择框之类的东西,最简单的就是input.select. 关于select的使用我们通常会需要从数据库中返回数据进行动态绑定. 此时我们会有两种方式: 1)使用ng-re ...

  7. Maven和Gradle的比较

    Gradle和Maven都是项目构建工具,但是完全是两个产品,maven应该目前在java企业级开发中占的比重比较大,Gradle是后起之秀,Google的Android Stadio主推的就是Gra ...

  8. java代码FileInputStream的复制粘贴练习

    所有的输入输出流都是对于程序来说的,这个图是实现文件内容的复制粘贴功能的e 首先把文件读到哦程序里,然后把程序读出到文件l package com.a.b; //这个复制和粘贴-----------首 ...

  9. Big Water Problem

    链接:https://www.nowcoder.com/acm/contest/77/B来源:牛客网 Big Water Problem 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...

  10. 1095 Cars on Campus

    题意:给出N量车的车牌号,进出的时间,进/出状态.然后给出若干个查询,要求计算在每一查询时刻校园内停着的汽车数量,最后输出这一天中停放时间最长的车辆(若车不止一辆,则按字典序输出)以及停放时间.注:查 ...