- 浏览: 537320 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (294)
- Java基础 (40)
- 架构分析 (37)
- 开发心得 (22)
- 架构乐园 (12)
- Java Web (6)
- 大牛专区 (5)
- 转载专区 (40)
- 小技巧 (16)
- Linux专区 (8)
- linux (3)
- Spring (2)
- N (1)
- 前台JS (1)
- SAP NETWEAVER (3)
- JMS (4)
- queue (1)
- 数据模型 (2)
- oracle (2)
- sqlserver (2)
- ubuntu (2)
- install gcc (1)
- MEMCACHED (2)
- SQLSERVER 驱动 (1)
- JVM GC 调优 (1)
- 服务器运维 (1)
- activiti 国际化 中文 (1)
- activiti (1)
- 前端开发 (1)
- tar.gz (1)
- Web安全 (1)
- CSRF (1)
- 技术架构 (4)
- 性能指标 (1)
- 响应时间 (1)
- 淘宝 (1)
- linux安装 (1)
- lucene (1)
- Mongodb (1)
- gis (1)
- 微信授权 code access_token open_id (1)
- Redis java 获取 (1)
- HTTP 跨域 同源策略 cookie (1)
- java 加密 3DES (1)
- CROS (1)
- Cookie (1)
- Rest (1)
- 跨域资源共享 (1)
- 3DES (1)
- Effective java读后感 (1)
- nginx (1)
- Tengine 开发 (1)
- HTTP/1.1 废弃 javaWEB (1)
- 支付宝 支付状态 (1)
- maven jdk (1)
- 应用宝统一链接 (1)
- git (2)
- git 代码上传 (1)
- ubuntu 安装 mysql 5.6 (1)
- Linux 命令学习 (3)
- Linux 命令 60 (2)
- linux 命令 (2)
- linux nginx 安装 (1)
- grant revoke (1)
- linxu jdk profile (1)
- git 使用 (1)
- 架构设计 (1)
- 上海居转户 居转户 (1)
- wind (1)
- elastic-job (1)
- Mysql (1)
- 个人站点 (1)
- nginx lua waf 实现 (1)
- github 算法指南 (1)
- go (1)
- MapReduace 大数据 (1)
- 架构PPT (1)
最新评论
-
jingchh:
帅哥, 这个类是哪个包下面的呢? 应该下载哪个jar包,谢谢~ ...
StringUtils工具类的常用方法 -
Nabulio:
StringUtils工具类的常用方法 -
yuanyuan2597:
那请问,按照你的方法进行修改调用。SELECT locatio ...
根据经纬度实现附近搜索Java实现 -
yangguo:
这个经理有病,埋伏打他一顿。
复试 等电话 -
emparadise329:
进一步学习了子类与父类间的关系
Java 子类对象实例化 面试题
用过Java并发包的朋友或许对Future (interface)
已经比较熟悉了,其实Future
本身是一种被广泛运用的并发设计模式,可在很大程度上简化需要数据流同步的并发应用开发。在一些领域语言(如Alice ML
)中甚至直接于语法层面支持Future。 这里就以java.util.concurrent.Future
为
例简单说一下Future的具体工作方式。Future对象本身可以看作是一个显式的引用,一个对异步处理结果的引用。由于其异步性质,在创建之初,它所
引用的对象可能还并不可用(比如尚在运算中,网络传输中或等待中)。这时,得到Future的程序流程如果并不急于使用Future所引用的对象,那么它
可以做其它任何想做的事儿,当流程进行到需要Future背后引用的对象时,可能有两种情况: 对于前一种情况,可以通过调用Future.isDone()判断引用的对象是否就绪,并采取不同的处理;而后一种情况则只需调用get()或 简单而言,Future模式可以在连续流程中满足数据驱动的并发需求,既获得了并发执行的性能提升,又不失连续流程的简洁优雅。 除了Future外,其它比较常见的并发设计模式还包括“回调驱动(多线程环境下)”、“消息/事件驱动(Actor模型中)”等。 回
调是最常见的异步并发模式,它有即时性高、接口设计简单等有点。但相对于Future,其缺点也非常明显。首先,多线程环境下的回调一般是在触发回调的模
块线程中执行的,这就意味着编写回调方法时通常必须考虑线程互斥问题;其次,回调方式接口的提供者在本模块的线程中执行用户应用的回调也是相对不安全的,
因为你无法确定它会花费多长时间或出现什么异常,从而可能间接导致本模块的即时性和可靠性受影响;再者,使用回调接口不利于顺序流程的开发,因为回调方法
的执行是孤立的,要与正常流程汇合是比较困难的。因此回调接口适合于在回调中只需要完成简单任务,并且不必与其它流程汇合的场景。 上
述这些回调模式的缺点恰恰正是Future的长项。由于Future的使用是将异步的数据驱动天然的融入顺序流程中,因此你完全不必考虑线程互斥问
题,Future甚至可以在单线程的程序模型(例如协程)中实现(参见下文将要提到的“Lazy
Future”)。另一方面,提供Future接口的模块完全不必担心像回调接口那样的可靠性问题和可能对本模块的即时性影响。 另
一类常见的并发设计模式是“消息(事件)驱动”,它一般运用在Actor模型中:服务请求者向服务提供者发送消息,然后继续进行后续不依赖服务处理结果的
任务,在需要依赖结果前终止当前流程并记录状态;在等到回应消息后根据记录的状态触发后续流程。这种基于状态机的并发控制虽然比回调更适合于有延续性的顺
序流程,但开发者却不得不将连续流程按照异步服务的调用切断为多个按状态区分的子流程,这样又人为的增加了开发的复杂性。运用Future模式可以避免这
个问题,不必为了异步调用而打碎连续的流程。但是有一点应当特别注意:Future.get()方法可能会阻塞线程的执行,所以它通常无法直接融入常规的
Actor模型中。(基于协程的Actor模型可以较好的解决这个冲突) Future
的灵活性还体现在其同步和异步的自由取舍,开发者可以根据流程的需要自由决定是否需要等待[Future.isDone()],何时等待
[Future.get()],等待多久[Future.get(timeout)]。比如可以根据数据是否就绪而决定要不要借这个空档完成点其它任务,
这对于实现“异步分支预测”机制是相当方便的。 除了上面提到的基础形态之外,Future还有丰富的衍生变化,这里就列举几个常见的。 与
一般的Future不同,Lazy Future在创建之初不会主动开始准备引用的对象,而是等到请求对象时才开始相应的工作。因此,Lazy
Future本身并不是为了实现并发,而是以节约不必要的运算资源为出发点,效果上与Lambda/Closure类似。例如设计某些API时,你可能需
要返回一组信息,而其中某些信息的计算可能会耗费可观的资源。但调用者不一定都关心所有的这些信息,因此将那些需要耗费较多资源的对象以Lazy
Future的形式提供,可以在调用者不需要用到特定的信息时节省资源。 另外Lazy Future也可以用于避免过早的获取或锁定资源而产生的不必要的互斥。 Promise
可以看作是Future的一个特殊分支,常见的Future一般是由服务调用者直接触发异步处理流程,比如调用服务时立即触发处理或 Lazy
Future的取值时触发处理。但Promise则用于显式表示那些异步流程并不直接由服务调用者触发的情景。例如Future接口的定时控制,其异步流
程不是由调用者,而是由系统时钟触发,再比如淘宝的分布式订阅框架提供的Future式订阅接口,其等待数据的可用性不是由订阅者决定,而在于发布者何时
发布或更新数据。因此,相对于标准的Future,Promise接口一般会多出一个set()或fulfill()接口。 常
规的Future是一次性的,也就是说当你获得了异步的处理结果后,Future对象本身就失去意义了。但经过特殊设计的Future也可以实现复用,这
对于可多次变更的数据显得非常有用。例如前面提到的淘宝分布式订阅框架所提供的Future式接口,它允许多次调用waitNext()方法(相当于
Future.get()),每次调用时是否阻塞取决于在上次调用后是否又有数据发布,如果尚无更新,则阻塞直到下一次的数据发布。这样设计的好处是,接
口的使用者可以在其任何合适的时机,或者直接简单的在独立的线程中通过一个无限循环响应订阅数据的变化,同时还可兼顾其它定时任务,甚至同时等待多个
Future。简化的例子如下:
什么是Future?
get(long timeout, TimeUnit unit)通过同步阻塞方式等待对象就绪。实际运行期是阻塞还是立即返回就取决于get()的调用时机和对象就绪的先后了。(如下图所示)
与其它并发设计模式的对比
Future的衍生
for (;;) {
schedule = getNextScheduledTaskTime();
while(schedule > now()) {
try {
data = subscription.waitNext(schedule - now());
processData(data);
} catch(Exception e) {...}
}
doScheduledTask();
}
发表评论
-
eclipse 插件式安装 maven
2016-06-02 16:46 622以下为补充内容: 由于Maven项目地址经常变动,以上ma ... -
HTTP 接口设计指南
2016-01-12 15:04 3997# HTTP 接口设计指北 * 文档主要目的是为设计 ... -
IP 查询开放API
2015-10-12 19:57 983今天项目要用到 查询访问网站用户的IP 然后网上查询了 资料还 ... -
freemarker 数字输出中的逗号问题
2015-08-17 11:50 1674分类: Freemarker2012-04-23 1 ... -
redis cli 客户端连接
2015-07-27 15:31 1018Last login: Mon Jul 27 15:31:4 ... -
MySQL 建立索引
2015-05-05 09:16 790索引是一种特殊的数据结构,可以用来快速查询数据库的特定记录, ... -
[DB][MySql]关于取得自增字段的值、及@@IDENTITY 与并发性问题
2015-04-07 12:43 1597对于刚从Oracle转向MySql的人都会为,MySql中没 ... -
POI 合并单元格
2014-12-25 10:01 1142在用poi在EXECL报表设计的时候,遇到单元格合并问题,用 ... -
两个相同结构表 数据的 对复制
2014-12-09 17:43 817insert into TRP_MEMBER_RECOMMEN ... -
文章主要是介绍DB2取得当前时间的正确解析,如果你是DB2取得当前时间的内容解析,如果你是这方面的新手,对DB2取得当前时间的正确解的相关实际应用不是很了解的话
2013-09-26 19:05 769文章主要是介绍DB2取得当前时间的正确解析,如果你是DB2取 ... -
Lucene 3.X 自定义排序
2013-09-18 16:26 1301Lucene 3.X 自定义排序 发表于 2012 年 ... -
DB2时间函数
2013-08-12 20:11 2656DB2时间函数 DB2时间函数简单总结: ... -
linux 新建用户、用户组 以及为新用户分配权限
2013-08-07 19:14 958linux 新建用户、用户组 以及为新用户分配权限 P ... -
Lucene的分页查询
2013-08-06 16:05 855Lucene的分页查询 Posted on 2012- ... -
lucene3.0_IndexSearcher的基础使用及注意事项
2013-08-06 15:05 972lucene3.0_IndexSearcher的基础使用及注 ... -
ibatis db2 insert模板
2013-05-07 20:32 1158iBatis and DB2 INSERT statemen ... -
DB2 -创建用户和组,数据库
2013-05-06 18:05 72451、增加一个操作系统用户 groupadd test--- ... -
oracle 创建用户和表空间
2013-01-15 18:15 11071,创建临时表空间create temporary tab ... -
Java Web 胡言乱语 之--- JSP标准标签库
2012-05-08 09:27 1092JSTL 主要的标签分类: 1,核心标签库 c: ... -
JSP标签开发--详解
2012-05-04 17:42 4306标签开发之几大步骤: ...
相关推荐
在Java编程领域,高并发程序设计模式是解决系统性能瓶颈、提升系统响应速度和处理能力的关键技术。这一主题涵盖了多线程、并发控制、同步机制、分布式架构等多个方面。以下是对这一主题的详细阐述: 1. **并发基础*...
在本套"实战Java高并发程序设计模式高清视频教程"中,我们将深入探讨Java平台上的高并发编程技术和设计模式,这对于任何希望构建可扩展、高效且健壮的后端服务的开发者来说,都是必不可少的知识。Java作为业界广泛...
本文将深入探讨Java并发编程的设计原则与模式,旨在帮助开发者理解并有效地应用这些原则和模式。 一、并发编程的基础概念 并发是指两个或多个操作在同一时间间隔内执行,而不是严格意义上的同一时刻。在Java中,...
3. **并发设计模式**:设计模式是解决特定问题的成熟方案。在并发编程中,常见的模式有生产者消费者模式、读写锁模式、单例模式(考虑线程安全的双重检查锁定)等。这些模式可以帮助开发者避免并发问题,提升代码的...
三、并发设计原则 1. **最小化锁的粒度**:尽可能减少锁保护的代码范围,降低锁竞争。 2. **避免死锁**:避免多个线程相互等待对方释放资源而形成死锁。 3. **避免活锁**:当线程不断尝试但总是失败时,应有超时或重...
10. **并发模式**:书中可能还会介绍生产者消费者模式、读写锁模式、双端队列模式等经典的并发设计模式,帮助开发者解决实际问题。 通过学习《Java并发编程实战》的源码,你可以更直观地了解这些概念如何在实际代码...
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
在Java编程领域,并发程序设计是一项至关重要的技能,特别是在多核处理器和分布式系统环境中。Java提供了丰富的并发工具和API,使得开发者能够有效地编写出高效、安全的并发应用程序。本教程将深入探讨Java并发编程...
书中还可能包含对并发设计模式的探讨,比如生产者-消费者模式,以及如何利用这些模式来设计高效的并发程序。作者可能还会分享如何测试和调试并发程序,这是并发编程中非常困难且容易被忽视的一部分。包括性能分析、...
Java多线程是并发编程的重要组成部分,设计模式则是软件工程中用于解决特定问题的最佳实践。将两者结合起来,意味着此文件可能详细讨论了在多线程环境下解决并发问题所采用的设计模式,这包括了线程安全的实现、资源...
Java设计模式和并发编程是Java开发中的两个重要领域,它们对于构建高效、可维护的软件系统至关重要。设计模式是经过时间验证的解决常见问题的最佳实践,而并发编程则是利用多核处理器的优势,提高应用程序的执行效率...
7. **并发设计模式**:书中也会涵盖一些经典的并发设计模式,如生产者消费者模型、读写锁、双检锁等,这些都是解决并发问题的有效工具。 8. **并发异常处理**:在并发环境下,异常处理变得更为复杂,书中有专门章节...
Java平台提供了丰富的API来支持并发,如`Thread`类、`ExecutorService`接口和`Future`接口等。这些工具允许开发者设计出能够充分利用多核处理器性能的高效程序。 书中详细讲解了以下关键知识点: 1. **线程安全**...
### 并发设计模式 #### 一、设计模式概述 设计模式是在软件开发过程中,针对常见问题提出的一系列经过验证的解决方案。它们帮助开发者更好地理解并解决特定的问题,并且能够提高代码的可读性、可维护性和可扩展性...
10. **并发设计模式**:例如生产者消费者模式、读写锁策略、双检锁/双重校验锁(DCL)等,这些都是解决并发问题的经典模式。 以上知识点是Java并发编程书籍通常会涵盖的内容,通过深入学习和实践,开发者能够编写出...
Java并发编程是Java开发者必须掌握的...此外,书中还可能涉及Java内存模型、线程通信(如wait/notify机制)以及并发设计模式等高级主题。总的来说,Java并发编程是一门深奥的学问,需要不断学习和实践才能真正精通。
Java多线程设计模式是构建高并发、高性能应用的关键技术之一。这些模式通过优化资源利用、提高程序可读性和可维护性,使并发编程更加高效和安全。以下将详细讲解标题和描述中涉及的一些核心知识点: 1. **线程池...
在Java编程领域,多线程设计模式是一种至关重要的技术,特别是在构建高效、可扩展和并发的应用程序时。本文将深入探讨Java多线程设计模式及其源代码,旨在帮助开发者理解和应用这些模式,提升代码的并发性能和可维护...