JAVA ’ 目录归档

《Netty 权威指南》—— AIO 创建的TimeServer源码分析

声明:本文是《Netty 权威指南》的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文。

NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取获取操作结果:

  • 通过java.util.concurrent.Future类来表示异步操作的结果;
  • 在执行异步操作的时候传入一个java.nio.channels.

CompletionHandler接口的实现类作为操作完成的回调。

NIO2.0的异步套接字通道是真正的异步非阻塞IO,它对应Unix网络编程中的事件驱动IO(AIO),它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写,简化了NIO的编程模型。

下面还是通过代码来熟悉NIO2.0 AIO的相关类库,我们仍旧以时间服务器为例程进行讲解。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Netty 权威指南》—— AIO 创建的TimeServer源码分析


《Netty 权威指南》—— NIO客户端序列图

声明:本文是《Netty 权威指南》的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文。

步骤一:打开SocketChannel,绑定客户端本地地址(可选,默认系统会随机分配一个可用的本地地址),示例代码如下:

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《Netty 权威指南》—— NIO客户端序列图


Storm入门之附录C

本文翻译自《Getting Started With Storm》译者:吴京润    编辑:郭蕾 方腾飞

安装实际的例子

译者注:有些软件的最新版本已有变化,译文不会完全按照原文翻译,而是列出当前最新版本的软件。

首先,从下述GitHub的URL克隆这个例子:

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Storm入门之附录C


Storm入门之第8章事务性拓扑

本文翻译自《Getting Started With Storm》译者:吴京润    编辑:郭蕾 方腾飞

正如书中之前所提到的,使用Storm编程,可以通过调用ack和fail方法来确保一条消息的处理成功或失败。不过当元组被重发时,会发生什么呢?你又该如何砍不会重复计算?

 

Storm0.7.0实现了一个新特性——事务性拓扑,这一特性使消息在语义上确保你可以安全的方式重发消息,并保证它们只会被处理一次。在不支持事务性拓扑的情况下,你无法在准确性,可扩展性,以空错性上得到保证的前提下完成计算。

 

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Storm入门之第8章事务性拓扑


hashCode()方法的性能优化

原文链接译文链接,原文作者: Robert Nystrom,译者:有孚

本文主要讨论下不同的hashCode()的实现对应用程序的性能影响。

hashCode()方法的一个主要作用就是使得对象能够成为哈希表的key或者散列集的成员。但同时这个对象还得实现equals(Object)方法,它和hashCode()的实现必须是一致的:

  • 如果a.equals(b)那么a.hashCode == b.hashCode()
  • 如果hashCode()在同一个对象上被调用两次,它应该返回的是同一个值,这表明这个对象没有被修改过。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: hashCode()方法的性能优化


面向GC的Java编程

感谢同事【沐剑】的投稿

Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题。以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,就交给GC来做吧!甚至有人说,如果在编程过程中频繁考虑内存问题,是一种退化,这些事情应该交给编译器,交给虚拟机来解决。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 面向GC的Java编程


五个改善你服务器日志的技术

原文链接译文链接,译者:梁海舰,校对:方腾飞

 

 

duke_log

最近我们看到各种各样新的工具,能够帮助你搞定日志。开源的项目如Scribe和LogStash,在线的工具如Splunk,托管的服务如Sumologic和PaperTrail。这些工具可以帮你减少大量日志数据。

但是有一个东西它们都无法帮到你,它们都依赖你实际放入日志中的数据。获得更多、更高质量数据的任务就落在你身上了。所以,在关键时刻你需要调试部分代码和丢失的日志数据,你可能要取消晚饭了。

为了减少以上情况发生的次数,我要给你分享5件事情,当你在生产环境使用日志的时候你必须紧记在心: 阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 五个改善你服务器日志的技术


Map or switch

感谢同事 {空蒙}的投稿

最近碰到个场景,还蛮有普遍性的,如mtop的请求入口非常多,有api2,api3,api4,h5,h5update,cdn_cache,bigpipe等,而Mtop需要依据其具体的入口,选择不同的业务逻辑进行对应的处理。

马上想到两个方案:

  1. 方案一:采用map存放对应入口的处理方法,然后请求进来后经过get就行,map.get(et);
  2. 方案二:采用switch语句。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Map or switch


Tomcat7.0.26的连接数控制bug的问题排查

感谢同事[空蒙]的投稿。

首先感谢@烈元一起排查此问题。今天发现线上一台机器,监控一直在告警,一看是健康检查不通过,就上去查看了下,首先自己curl了下应用的url,果然是超时没有响应,那就开始按顺序排查了:

1、 load非常低,2、gc也正常,3、线程上也没死锁,4、日志一切正常。那是什么情况呢,不能忘记网络啊。果然,netstat命令一把,结果如下:

TIME_WAIT 68
CLOSE_WAIT 194
ESTABLISHED 3941
SYN_RECV 100

问题出来了,SYN_RECV竟然达到100个,正常情况下,半连接的请求应该是很小的。而且我们机器是内部的,不是lvs,不太会有半连接攻击,怎么可能达到这么大呢?

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Tomcat7.0.26的连接数控制bug的问题排查


更快的AtomicInteger

感谢同事【空蒙】的投稿

之前看了java8的longadder实现,最近又看到一篇文章介绍longadder实现的。其实现思路也是分段,最后需要get的时候,再进行sum计算。其核心思路就是减少并发,但之前老的Atomic,难道就没有提升的空间了吗?昨晚进行了一次测试。测试代码如下:

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 更快的AtomicInteger


聊聊并发(十)生产者消费者模式

本文首发于InfoQ   作者:方腾飞  校对:张龙

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

为什么要使用生产者和消费者模式

在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,所以便有了生产者和消费者模式。

什么是生产者消费者模式

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 聊聊并发(十)生产者消费者模式


Java8之使用新JS解释器Nashorn编译Lambda表达式

Nashron.mainImage.fw_
原文链接 作者:Tal Weiss  CEO of Takipi  译者:踏雁寻花,xbkaishui  校对:方腾飞

在最近的一篇文章中,我了解了一下Java8和Scala是如何实现 Lambda 表达式的。正如我们所知道的,Java8不仅对javac编辑器做了很大改进,它还加入了一个全新的项目—Nashorn。这个新的解释器将会代替Java现有的Rhino解释器。据说它执行JavaScript的速度非常之快,就像世界上最快的跑车 V8s,所以,我觉得现在很有必要打开Nashorn源码,看看它是如何编译 Lambda 表达式的(着重于Java 和 Scala的对比)。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java8之使用新JS解释器Nashorn编译Lambda表达式


Java中的5种同步辅助类

原文地址 译者:何一昕 校对:方腾飞

概述

当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问。线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线程环境下的协调执行机制。

通过API来获取和释放锁(使用互斥器)或者调用wait/notify等方法都是底层调用的方式。进一步来说,有必要为线程同步创建更高层次的抽象。通常用到的同步辅助类,就是对2个或多个线程间的同步活动机制做进一步封装,其内部原理是通过使用现有的底层API来实现复杂的线程间的协调。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java中的5种同步辅助类


Storm入门之第7章使用非JVM语言开发

本文翻译自《Getting Started With Storm》译者:吴京润    编辑:郭蕾 方腾飞

有时候你可能想使用不是基于JVM的语言开发一个Storm工程,你可能更喜欢使用别的语言或者想使用用某种语言编写的库。

Storm是用Java实现的,你看到的所有这本书中的spoutbolt都是用java编写的。那么有可能使用像Python、Ruby、或者JavaScript这样的语言编写spoutbolt吗?答案是当然

 

可以!可以使用多语言协议达到这一目的。

多语言协议是Storm实现的一种特殊的协议,它使用标准输入输出作为spoutbolt进程间的通讯通道。消息以JSON格式或纯文本格式在通道中传递。

我们看一个用非JVM语言开发spoutbolt的简单例子。在这个例子中有一个spout产生从1到10,000的数字,一个bolt过滤素数,二者都用PHP实现。

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Storm入门之第7章使用非JVM语言开发


Storm入门之第6章一个实际的例子

本文翻译自《Getting Started With Storm》译者:吴京润    编辑:郭蕾 方腾飞

本章要阐述一个典型的网络分析解决方案,而这类问题通常利用Hadoop批处理作为解决方案。与Hadoop不同的是,基于Storm的方案会实时输出结果。

 

 

我们的这个例子有三个主要组件(见图6-1)

  • 一个基于Node.js的web应用,用于测试系统
  • 一个Redis服务器,用于持久化数据
  • 一个Storm拓扑,用于分布式实时处理数据

阅读全文

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Storm入门之第6章一个实际的例子


return top