Java并发编程之——Amino框架
Amino框架是一个采用无锁方式实现并行计算的框架,可惜的是,网上关于Amino框架的介绍甚少。根据所掌握的资料,稍微总结一下:
1. 锁机制到无锁机制
2. 基于Compare-and-swap(CAS) 算法的无锁并发控制方法
- public final int getAndSet(int newValue){
- for(;;){
- int current=get();
- if(compareAndSet(current,newValue))
- return current;
- }
- }
3. 引出Amino框架
4. 性能测试
- public class CopyList {
- public static void test1(AccessListTread t, String name){
- CounterPoolExecutor exe0=new CounterPoolExecutor(2000,2000,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
- exe0.TASK_COUNT=8000;
- exe0.funcname=name;
- exe0.startTime=System.currentTimeMillis();
- for(int i=0;i<exe0.TASK_COUNT;i++)
- exe0.submit(t);//测试数据:8000
- exe0.shutdown();
- }
- public static void main(String[] args) {
- AccessListTread t=new AccessListTread();
- t.initCopyOnWriteArrayList();
- test1(t,"testCopyOnWriteArrayList");
- t.initVector();
- test1(t,"testVector");
- t.initLockFreeList();
- test1(t,"testLockFreeList");
- t.initLockFreeVector();
- test1(t,"testLockFreeVector");
- }
- }
- class CounterPoolExecutor extends ThreadPoolExecutor{
- public AtomicInteger count=new AtomicInteger(0);//统计次数
- public long startTime=0;
- public String funcname="";
- public int TASK_COUNT=0;
- public CounterPoolExecutor(int corePoolSize, int maximumPoolSize,
- long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
- super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
- }
- @Override
- protected void afterExecute(Runnable r,Throwable t){
- int l=count.addAndGet(1);
- if(l==TASK_COUNT){
- System.out.println(funcname+"spend time:"+(System.currentTimeMillis()-startTime));
- }
- }
- }
- class AccessListTread implements Runnable{
- Random rand=new Random();
- List list;
- public AccessListTread() {
- }
- @Override
- public void run() {
- try {
- for(int i=0;i<1000;i++)
- // getList(rand.nextInt(1000));
- handleList(rand.nextInt(1000));
- Thread.sleep(rand.nextInt(100));
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- private Object getList(int nextInt) {
- return list.get(nextInt);
- }
- private Object handleList(int index) {
- list.add(index);
- list.remove(index%list.size());
- return null;
- }
- //test
- public void initCopyOnWriteArrayList(){
- list=new CopyOnWriteArrayList();
- for(int i=0;i<1000;i++)
- list.add(i);
- }
- public void initVector(){
- list=new Vector();
- for(int i=0;i<1000;i++)
- list.add(i);
- }
- public void initLockFreeList(){
- list=new LockFreeList();
- for(int i=0;i<1000;i++)
- list.add(i);
- }
- public void initLockFreeVector(){
- list=new LockFreeVector();
- for(int i=0;i<1000;i++)
- list.add(i);
- }
- }
测试结果:
- testVectorspend time:366
- testCopyOnWriteArrayListspend time:717
- testLockFreeListspend time:541
- testLockFreeVectorspend time:244
Java并发编程之——Amino框架的更多相关文章
- Java 并发编程 -- Fork/Join 框架
概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的 ...
- Java并发编程--Fork/Join框架使用
上篇博客我们介绍了通过CyclicBarrier使线程同步,可是上述方法存在一个问题,那就是假设一个大任务跑了2个线程去完毕.假设线程2耗时比线程1多2倍.线程1完毕后必须等待线程2完毕.等待的过程线 ...
- Java并发编程--4.Executor框架
简介 Executor框架是启动,管理线程的API, 它的内部实现是线程池机制,它有很多好处,比如使任务提交和任务执行解耦合,防止this逃逸:它的主要API包括: Executor, Execut ...
- java并发编程-Executor框架
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...
- Java 并发编程——Executor框架和线程池原理
Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...
- 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
<Java并发编程实战>和<Java并发编程的艺术> Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...
- (转)java并发编程--Executor框架
本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ...
- Java并发编程原理与实战三十二:ForkJoin框架详解
1.Fork/Join框架有什么用呢? ------->Fork使用来切分任务,Join是用来汇总结果.举个简单的栗子:任务是1+2+3+...+100这个任务(当然这个任务的结果有好的算法去做 ...
- Java 并发编程——Executor框架和线程池原理
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
随机推荐
- java project 项目在 linux 下面部署方法
1.前提是安装好了响应的开发和部署环境,例如jdk. 2.在Linux下运行可执行Jar包,首先准备jar包,一般的编译工具Eclipse,jbuilder都提供export功能,可以生成jar包. ...
- objectForKey与valueForKey在NSDictionary中的差异
从 NSDictionary 取值的时候有两个方法,objectForKey: 和 valueForKey:,这两个方法具体有什么不同呢? 先从 NSDictionary 文档中来看这两个方法的定义: ...
- ORACLE PL/SQL:触发器
ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...
- 微信小程序(3)——常用的组件
view: view是小程序中的视图容器之一,似于html中的<div>标签 <view class="section"> <view class=& ...
- Palindrome Degree(hash的思想题)
个人心得:这题就是要确定是否为回文串,朴素算法会超时,所以想到用哈希,哈希从左到右和从右到左的key值一样就一定是回文串, 那么问题来了,正向还能保证一遍遍历,逆向呢,卡住我了,后面发现网上大神的秦九 ...
- WCF、WebAPI、WCFREST、WebService之间的区别【转】
转自:http://www.cnblogs.com/markli/p/4460564.html 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了We ...
- PHP和JS页面跳转和刷新总结
PHP 页面跳转: // 只是跳转,所以一定要用die();或者exit;终止下一步操作; header('location:index.php'); exit; // 等待3秒,跳转并刷新 head ...
- __getitem__ 专用方法
(1) __getitem__ 专用方法很简单.像普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值.但是怎么调用它呢?哦,你可以直接调用 __getitem ...
- 在Qt中如何使用QtDesigner创建的UI文件(一) (转)
使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要开 ...
- springboot+idea 热部署
1 配置pom.xml <!--spring-boot-devtools 热部署--> <dependency> <groupId>org.springframew ...