- 浏览: 599644 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
fei33423:
同意你的说法. hbase 的强一致性分为两部分来说. 数据分 ...
浅谈Hbase 的强一致性 -
zengwenbo5566:
,高人,刚安装了 genymotion 那个附带 virtu ...
VirtualBox报错Unable to load R3 module GetLastError=1790 (VERR_UNRESOLVED_ERROR -
kabike:
QQ1289714862 写道这代码有问题吧 bar1 bar ...
AtomicBoolean运用 -
QQ1289714862:
这代码有问题吧 bar1 bar2 那来的 你是不是new了两 ...
AtomicBoolean运用 -
DEMONU:
需要依赖这么多东西啊
hbase 0.96和hadoop 2.2 java 客户端的jar依赖
最近看了下clojure的并发,其中提到了agent.agent的原理是把对agent的action提交到线程池中运行.它保证线程安全的措施是对每一个agent,同时只有一个actio
在运行.
下面做一个简单的对比,多个线程多次对同一个StringBuilder进行append,如果不同步,结果是不正确的.
输出结果不是ITERATION_NUMBER * THREAD_NUMBER
可以用synchronized或者java 1.5里的lock来同步,也可以仿照agent的原理,不使用同步机制,而是让action顺序执行
结果表明,让action顺序执行,而不使用lock或者synchronized等手段,效率确实比较高.
在运行.
下面做一个简单的对比,多个线程多次对同一个StringBuilder进行append,如果不同步,结果是不正确的.
final StringBuilder sb = new StringBuilder(); ExecutorService pool = Executors.newFixedThreadPool(Runtime .getRuntime().availableProcessors() + 2); for (int i = 0; i < THREAD_NUMBER; i++) { pool.submit(new Runnable() { @Override public void run() { for (int j = 0; j < ITERATION_NUMBER; j++) { sb.append(bar); } } }); } pool.shutdown(); pool.awaitTermination(60, TimeUnit.SECONDS); String s = sb.toString(); System.out.println(s.length() / bar.length());
输出结果不是ITERATION_NUMBER * THREAD_NUMBER
可以用synchronized或者java 1.5里的lock来同步,也可以仿照agent的原理,不使用同步机制,而是让action顺序执行
结果表明,让action顺序执行,而不使用lock或者synchronized等手段,效率确实比较高.
package foo.concurrency; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ClojureAgent { private static String bar = "log from full line a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long line\n"; private static int ITERATION_NUMBER = 4000; private static int THREAD_NUMBER = 6; public static void main(String[] args) throws Exception { long start = System.currentTimeMillis(); base(); System.out.println("time is " + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); sync(); System.out.println("time is " + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); lock(); System.out.println("time is " + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); pool(); System.out.println("time is " + (System.currentTimeMillis() - start)); } private static void pool() throws Exception { final StringBuilder sb = new StringBuilder(); ExecutorService pool = Executors.newFixedThreadPool(Runtime .getRuntime().availableProcessors() + 2); for (int i = 0; i < THREAD_NUMBER; i++) { pool.submit(new Callable<Object>() { @Override public Object call() throws Exception { for (int j = 0; j < ITERATION_NUMBER; j++) { sb.append(bar); } return null; } }).get(); } pool.shutdown(); pool.awaitTermination(60, TimeUnit.SECONDS); String s = sb.toString(); System.out.println(s.length() / bar.length()); } private static void sync() throws Exception { final StringBuilder sb = new StringBuilder(); ExecutorService pool = Executors.newFixedThreadPool(Runtime .getRuntime().availableProcessors() + 2); for (int i = 0; i < THREAD_NUMBER; i++) { pool.submit(new Runnable() { @Override public void run() { for (int j = 0; j < ITERATION_NUMBER; j++) { synchronized (sb) { sb.append(bar); } } } }); } pool.shutdown(); pool.awaitTermination(60, TimeUnit.SECONDS); String s = sb.toString(); System.out.println(s.length() / bar.length()); } private static void lock() throws Exception { final Lock lock = new ReentrantLock(); final StringBuilder sb = new StringBuilder(); ExecutorService pool = Executors.newFixedThreadPool(Runtime .getRuntime().availableProcessors() + 2); for (int i = 0; i < THREAD_NUMBER; i++) { pool.submit(new Runnable() { @Override public void run() { for (int j = 0; j < ITERATION_NUMBER; j++) { lock.lock(); try { sb.append(bar); } finally { lock.unlock(); } } } }); } pool.shutdown(); pool.awaitTermination(60, TimeUnit.SECONDS); String s = sb.toString(); System.out.println(s.length() / bar.length()); } private static void base() throws Exception { final StringBuilder sb = new StringBuilder(); ExecutorService pool = Executors.newFixedThreadPool(Runtime .getRuntime().availableProcessors() + 2); for (int i = 0; i < THREAD_NUMBER; i++) { pool.submit(new Runnable() { @Override public void run() { for (int j = 0; j < ITERATION_NUMBER; j++) { sb.append(bar); } } }); } pool.shutdown(); pool.awaitTermination(60, TimeUnit.SECONDS); String s = sb.toString(); System.out.println(s.length() / bar.length()); } }
发表评论
-
禁用vim中自动插入注释
2018-05-20 11:36 853我将一个配置文件复制到粘贴板,粘贴到另一个vim窗口的时候,如 ... -
maven查找所有依赖的license类型
2017-03-27 20:24 1288mvn project-info-reports:depend ... -
一些命令
2016-12-27 15:45 4891 maven assembly插件打包snapshot版本的 ... -
thrift使用中的一些问题
2015-05-07 11:11 4311 TSimpleServer居然是单线程阻塞式server ... -
maven的maven.test.skip和skipTests
2015-03-25 18:04 526maven.test.skip连编译test类都skip了 引 ... -
同步hadoop配置文件
2015-01-08 10:54 712#!/bin/bash HADOOP_HOME=/usr/l ... -
hibernate one to many 查询返回了重复的数据
2014-12-24 23:38 1329很奇怪为什么设计成这样... https://develope ... -
用eclipse来debug
2014-12-24 23:30 564不错的文章,好多debug技巧 http://www.voge ... -
修改vim里注释的颜色
2014-11-12 18:40 1231vim里蓝色的注释太难以看清楚了,在~/.vimrc里加入 h ... -
VirtualBox报错Unable to load R3 module GetLastError=1790 (VERR_UNRESOLVED_ERROR
2014-11-12 12:53 3925在win7上VirtualBox创建个虚拟机各种莫名其妙的错误 ... -
maven repository损坏导致eclipse无法将web工程发布到tomcat
2014-09-17 16:07 2277在eclipse中建立的maven的web工程,发布到tomc ... -
maven工程中解决spring的依赖问题
2014-06-27 15:54 793在maven工程中,添加了spring-aop的依赖,没想到启 ... -
C# winform程序提交带文件的form
2014-06-25 11:47 1194在html页面里,可以在form里提交file和普通input ... -
windows7 下以其他用户运行程序
2014-04-21 09:49 789windows7 下如果想以其他用户运行程序,可以按住shif ... -
tomcat中无法运行solr 4.6
2014-02-25 10:52 627运行tomcat后solr app没有部署成功.报错是 引用 ... -
eclipse 链接外部文件夹
2014-02-21 10:14 1237http://lippeng.iteye.com/blog/9 ... -
dbunit进行数据库操作的测试
2013-02-21 21:26 3629j2ee程序好多都涉及到了数据库操作,这时进行mock测试就没 ... -
搜索引擎site关键字的站内搜索
2013-01-30 15:20 1191比如google里搜索dom element,老是有些乱七八糟 ... -
eclipse重新import被删除的项目
2013-01-14 10:55 4058eclipse工作区里项目太多了,所以删了几个(但是没物理删除 ... -
git创建branch 报错fatal: Not a valid object name: 'master'.
2013-01-11 13:01 21868听说git比svn的branch功能好,所以装了个msysgi ...
相关推荐
Lacinia 纯Clojure实现的GraphQL
一个小型遗传算法框架,用 Clojure 编写
带语法高亮的clojure 1.4 解释器, 对学习clojure很有帮助
Clojure is an opinionated language—it doesn’t try to cover all paradigms or provide every checklist bullet-point feature. Instead it provides the features needed to solve all kinds of real-world ...
这是Programming Clojure 电子版的 纸质版本在美国亚马逊要到2009年3月才能上架 Paperback: 200 pages Publisher: Pragmatic Bookshelf (March 15, 2009) Language: English ISBN-10: 1934356336 ISBN-13: 978-...
在 clojure 中重新实现了的旧游戏。 我的目标是以功能性的方式重新创建这个旧游戏,同时学习 clojure。 作为这项工作的一部分,我学到了很多关于语言的知识。 但是,还有几个地方我还不清楚。 我为这个应用程序写...
cljc-bloom 一个用Clojure(脚本)实现的跨平台布隆过滤器
component, 在Clojure中,有状态对象的托管生命周期 组件'组件'是一个用于管理具有运行时状态的软件组件的生命周期和依赖性的微小Clojure框架。这主要是一个带有几个 helper 函数的设计 Pattern 。 它可以被看作是...
clojure, 在Clojure中,Exercism练习 Exercism Track Clojure中的Exercism练习贡献指南请参见贡献指南。 Clojure iconClojure logo 是由富Hickey拥有的。 我们使用它来识别Clojure语言本身,而不是Exe
Selmer, 在Clojure中,一个快速Django 启发的模板系统 Selmer 一个快速的 Django 插件,为Clojure激发模板系统。安装命令行 Leiningen 备忘文档备注文档用法 跳转到筛选器内置过滤器add count count? not-empty f
Practical Clojure Clojure语言书籍
Clear, practical Clojure for the professional programmer Professional Clojure is the experienced developer's guide to functional programming using the Clojure language. Designed specifically to meet ...
clojure clojure clojureclojure clojure
【1】[Clojure编程乐趣](The Joy of Clojure).pdf 【2】Clojure – Functional Programming for the JVM中文版.pdf 【3】Clojure Cookbook.pdf 【4】Clojure Data Analysis Cookbook.pdf 【5】clojure Hand book...
主要特性:从 Java 中保护你的 Clojure 程序,进行安全的互操作,正确的使用外部 Java 库。Typed Clojure 支持关键字映射的使用,类型检测器中包含有用的映射操作,包括关键字查找,添加或者移除关键字,合并映射...
[2013] Functional Programming Patterns in Scala and Clojure - Write Lean Programs for the JVM.(Michael Bevilacqua-Linn).[1937785475].pdf+epub.rar [2014] Clojure Cookbook - Recipes for Functional ...
Clojure编程乐趣和clojure_programming.pdf两本书
[Pragmatic Bookshelf] 网络应用开发 (Clojure 实现) (英文版) [Pragmatic Bookshelf] Web Development with Clojure Build Bulletproof Web Apps with Less Code (E-Book) ☆ 图书概要:☆ If the usual ...
Clojure是一个JVM的动态函数式语言,最近发布了1.0版本,版本中Clojure提供了一个健壮的代码。Clojure是一套发展快速的新的编程语言,特别是,它为多核计算做了新的解决方案。在今后的软件设计中无论使用Clojure语言...