君子博学而日参省乎己 则知明而行无过矣

博客园 首页 新随笔 联系 订阅 管理

随笔分类 -  java并发编程

上一页 1 2 3 下一页

摘要:注:本文的主要参考资料为结城浩所著《JAVA多线程设计模式》。单线程执行模式(Single Threaded Execution Pattern)是最简单的多线程设计模式,几乎所有其他的模式都在不同程度上应用了该模式。先看一个程序,通过它可以体验多线程程序无法正确执行的场景,这里所写的是个关于“只能单个通过的门”的程序:有三个人频繁地、反复地经过一个只能容许单人经过的门,当人通过门的时候,这个程序显示出通过人的“姓名”与“出生地”,其代码如下:Java代码publicclassGate{privateintcounter=0;privateStringname="Nobody&quo 阅读全文
posted @ 2013-09-14 22:26 刺猬的温驯 阅读(827) 评论(0) 推荐(1)

摘要:这个专题主要讨论并发编程的问题,所有的讨论都是基于JAVA语言的(因其独特的内存模型以及原生对多线程的支持能力),不过本文传达的是一种分析的思路,任何有经验的朋友都能很轻松地将其扩展到任何一门语言。注:本文的主要参考资料为结城浩所著《JAVA多线程设计模式》。线程的英文名Thread,原意指“细丝”。在多线程程序中,若要追踪各个线程的轨迹,就会派生出一系列错综复杂的乱线团。假设在运行过程中,如果有人问到“请问现在执行到代码的哪一部分了?”,你需要多个手指头才能指出正确的地方。当应用程序的规模、复杂程度达到一定程度时,并发设计是一个必将考虑到的问题,以下是一些常见的应用:GUI:以word为例, 阅读全文
posted @ 2013-09-14 22:21 刺猬的温驯 阅读(3647) 评论(0) 推荐(1)

摘要:锁的劣势 Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程 持有守护变量的锁,都采用独占的方式来访问这些变量,如果出现多个线程同时访问锁,那第一些线线程将被挂起,当线程恢复执行时,必须等待其它线程执行完他 们的时间片以后才能被调度执行,在挂起和恢复执行过程中存在着很大的开销。锁还存在着其它一些缺点,当一个线程正在等待锁时,它不能做任何事。如果一个线 程在持有锁的情况下被延迟执行,那么所有需要这个锁的线程都无法执行下去。如果被阻塞的线程优先级高,而持有锁的线程优先级低,将会导致优先级反转 (Prior 阅读全文
posted @ 2013-07-23 02:21 刺猬的温驯 阅读(2591) 评论(0) 推荐(2)

摘要:简介:Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能。非阻塞算法属于并发算法,它们可以安全地派生它们的线程,不通过锁定派生,而是通过低级的原子性的硬件原生形式 —— 例如比较和交换。非阻塞算法的设计与实现极为困难,但是它们能够提供更好的吞吐率,对生存问题(例如死锁和优先级反转)也能提供更好的防御。在这期的 Java 理论与实践 中,并发性大师 Brian Goetz 演示了几种比较简单的非阻塞算法的工作方式。在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情。J 阅读全文
posted @ 2013-07-22 17:55 刺猬的温驯 阅读(367) 评论(0) 推荐(1)

摘要:简介:在 JDK 5.0 之前,如果不使用本机代码,就不能用 Java 语言编写无等待、无锁定的算法。在 java.util.concurrent 中添加原子变量类之后,这种情况发生了变化。请跟随并行专家 Brian Goetz 一起,了解这些新类如何使用 Java 语言开发高度可伸缩的无阻塞算法。您可以在本文的 论坛中与作者或其他读者共享您对本文的看法。(也可以通过单击文章顶部或者底部的 讨论链接来访问讨论。)十五年前,多处理器系统是高度专用系统,要花费数十万美元(大多数具有两个到四个处理器)。现在,多处理器系统很便宜,而且数量很多,几乎每个主要微处理器都内置了多处理支持,其中许多系统支持数 阅读全文
posted @ 2013-07-22 17:42 刺猬的温驯 阅读(465) 评论(0) 推荐(0)

摘要:spring的 ThreadPoolTaskExecutor类最终是通过调用java 的ThreadPoolExecutor的voidexecute(Runnable task)方法或Future<?> submit(Runnable task)方法执行任务的下面是spring的任务执行类和接口的继承层次interfaceExecutor void execute(Runnable command);interfaceTaskExecutorextends Executor void execute(Runnable task);interfaceAsyncTaskExecutor 阅读全文
posted @ 2012-12-17 10:55 刺猬的温驯 阅读(3521) 评论(0) 推荐(0)

摘要:前言:最近在做分布式海量数据处理项目,使用到了java的线程池,所以搜集了一些资料对它的使用做了一下总结和探究,前面介绍的东西大多都是从网上搜集整理而来。文中最核心的东西在于后面两节无界队列线程池和有界队列线程池的实例使用以及线上问题处理方案。 1. 为什么要用线程池?在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。在实际使用中,每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在实际处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个JVM中创建太多... 阅读全文
posted @ 2012-12-16 00:37 刺猬的温驯 阅读(351) 评论(0) 推荐(0)

摘要:JAVA5提供了多种类型的线程池,如果你对这些线程池的特点以及类型不太熟悉或者非常熟悉,请帮忙看看这篇文章(顺便帮忙解决里面存在的问题,谢谢!):http://xtu-xiaoxin.iteye.com/admin/blogs/647580 如果对ThreadPoolExecutor还不是很熟悉,可以看看一篇对ThreadPoolExecutor的介绍的博文:http://blog.csdn.net/waterbig/archive/2009/11/10/4794244.aspx 首先,JAVA中使用ThreadPoolExecutor的常用方式: 实例代码1Java代码Runnablerun 阅读全文
posted @ 2012-12-15 22:25 刺猬的温驯 阅读(1050) 评论(0) 推荐(0)

摘要:我们都知道使用线程池能够控制线程的数量,尤其是大量的“短命”线程存在时,线程池将大大降低系统消耗(内存和CPU)。不过,线程池也同样需要管理,于是我写了本篇。首先,我们来看看管理器的整个继承关系:显而易见,有ThreadPoolExecutor和ScheduledThreadPoolExecutor两个实现类,当然Executor类里也有一些内部类实现了特定的功能(如class DelegatedScheduledExecutorService),我们也可以自己通过扩展这里所有的接口、抽象类、类来实现自己的特定功能,如继承ThreadPoolExecutor类,覆写beforeExecute( 阅读全文
posted @ 2012-12-15 21:54 刺猬的温驯 阅读(337) 评论(0) 推荐(0)

摘要:Executor框架是juc里提供的线程池的实现。前两天看了下Executor框架的一些源码,做个简单的总结。线程池大概的思路是维护一个的线程池用于执行提交的任务。我理解池的技术的主要意义有两个:资源的控制,如并发量限制。像连接池这种是对数据库资源的保护。资源的有效利用,如线程复用,避免频繁创建线程和线程上下文切换。那么想象中设计一个线程池就需要有线程池大小、线程生命周期管理、等待队列等等功能,下面结合代码看看原理。Excutor整体结构如下:Executor接口定义了最基本的execute方法,用于接收用户提交任务。ExecutorService定义了线程池终止和创建及提交futureTas 阅读全文
posted @ 2012-12-15 21:42 刺猬的温驯 阅读(898) 评论(0) 推荐(0)

摘要:来源:YidingHe's Blog从 Java 5 开始,Java 提供了自己的线程池。线程池就是一个线程的容器,每次只执行额定数量的线程。 java.util.concurrent.ThreadPoolExecutor 就是这样的线程池。它很灵活,但使用起来也比较复杂,本文就对其做一个介绍。首先是构造函数。以最简单的构造函数为例:publicThreadPoolExecutor( intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable>wor 阅读全文
posted @ 2012-12-14 00:26 刺猬的温驯 阅读(399) 评论(0) 推荐(0)

摘要:使用httpClient可模拟请求Url获取资源,使用单线程的请求速度上会有一定的限制,参考了Apache给出的例子,自己做了测试实现多线程并发请求,以下代码需要HttpClient 4.2的包,可以在http://hc.apache.org/downloads.cgi下载1、并发请求View Code1packagegenerate.httpclient;23importjava.util.List;4importjava.util.concurrent.ExecutorService;5importjava.util.concurrent.Executors;67importorg.apa 阅读全文
posted @ 2012-11-22 18:05 刺猬的温驯 阅读(1552) 评论(0) 推荐(0)

摘要:前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。认识BlockingQueue阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示:从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出;常用的队列主要有以下两种:(当然通过不同的实现方式,还可以延伸出很多不同类型的队列,Dela. 阅读全文
posted @ 2012-11-18 23:11 刺猬的温驯 阅读(257) 评论(0) 推荐(0)

摘要:简介:Doug Lea 最初编写的util.concurrent包变成了 JSR-166 ,然后又变成了 J2SE 平台的 Tiger 版本。这个新库提供的是并发程序中通常需要的一组实用程序。如果对于优化对集合的多线程访问有兴趣,那么您就找对地方了。请在本文对应的讨论论坛上与作者 John Zukowski 及其他读者分享您对本文的想法。(您也可以单击文章顶部或底部的讨论来访问论坛)。在 Java 编程的早期阶段,位于 Oswego 市的纽约州立大学(SUNY) 的一位教授决定创建一个简单的库,以帮助开发人员构建可以更好地处理多线程情况的应用程序。这并不是说用现有的库就不能实现,但是就像有了标 阅读全文
posted @ 2012-11-16 00:54 刺猬的温驯 阅读(273) 评论(0) 推荐(0)

摘要:简介:您可能已经非常熟悉新的 Java? 5 语言的泛型支持、并发工具库以及它们对集合框架的影响,但是这些并不是 Tiger 中集合框架的惟一变化。这个月,John Zukowski 将介绍另外几项增强,其中包括新的集合类型,以及现有类和接口的附加特性。请参与本文的讨论论坛。(可以单击文章顶部的讨论来访问该论坛。)JDK 5.0 中最吸引人的地方在于集合框架的一些最突出的特性上,例如:支持泛型的语言级别上的新变化,以及可以在java.util.concurrent包中找到的并发集合工具包。实际上,以前在 developerWorks 上的“驯服 Tiger: 并发集合”和“介绍 JDK 5.0 阅读全文
posted @ 2012-11-16 00:54 刺猬的温驯 阅读(324) 评论(0) 推荐(0)

摘要:java5引入了很多新的并发容器和工具,极大的简化了并发程序的编写。本文先介绍Collections.synchronizedXXX工厂方法创建的同步容器的不足,再介绍ConcurrentHashMap,CopyOnWriterArrayList,BlockingQueue,CountDownLatch,Semaphore,CyclicBarrier和显示锁类。一、引言所有的并发问题都来源于如何协调访问并发状态,可变状态越少,并发控制也就越容易容易。没有可变状态的对象永远是现成安全。对有可变状态的对象的并发访问必须进行加锁,对每个方法都加锁并不能保证并发访问一定处于一致的状态。在构建并发程序的 阅读全文
posted @ 2012-10-28 17:22 刺猬的温驯 阅读(298) 评论(0) 推荐(0)

摘要:Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为:并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Executor.execute(Runnalbe)。Executor在执行时使用内部的线程池完成操作。一、创建线程池Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService 阅读全文
posted @ 2012-10-28 17:21 刺猬的温驯 阅读(285) 评论(0) 推荐(1)

摘要:这里提供两种在指定时间后启动线程的方法。一是通过java.util.concurrent.DelayQueue实现;二是通过java.util.concurrent.ScheduledThreadPoolExecutor实现。1. java.util.concurrent.DelayQueue类DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。它接受实现Delayed接口的实例作为元素。<<interface>>Delayed.javapackagejava.util.concurrent;importjava.util.*;publicinte 阅读全文
posted @ 2012-10-28 17:00 刺猬的温驯 阅读(548) 评论(0) 推荐(0)

摘要:1.类Executors此类中提供的一些方法有:1.1 public static ExecutorService newCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。1.2 public static ExecutorService newFixedThreadPool(intnThreads)创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。1.3 public static ExecutorService newSingleThreadE 阅读全文
posted @ 2012-10-28 16:48 刺猬的温驯 阅读(239) 评论(0) 推荐(0)

摘要:我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担.万幸的是,在JDK1.5出现之后,Sun大神(Doug Lea)终于为我们这些可怜的小程序员推出了java.util.conc 阅读全文
posted @ 2012-10-28 16:28 刺猬的温驯 阅读(367) 评论(0) 推荐(0)

上一页 1 2 3 下一页