关闭

Netty的并发编程实践4:线程安全类的应用

1681人阅读 评论(3) 收藏 举报
分类:

在JDK1.5的发行版本中,Java平台新增了java.util.concurrent,这个包中提供了一系列的线程安全集合、容器和线程池,利用这些新的线程安全类可以极大地降低Java多线程编程的难度,提升开发效率。

新的并发编程包中的工具可以分为如下4类。

◎   线程池Executor Framework以及定时任务相关的类库,包括Timer等。

◎   并发集合,包括List、Queue、Map和Set等。

◎   新的同步器,例如读写锁ReadWriteLock等。

◎   新的原子包装类,例如AtomicInteger等。

在实际编码过程中,我们建议通过使用线程池、Task(Runnable/Callable)、原子类和线程安全容器来代替传统的同步锁、wait和notify,以提升并发访问的性能、降低多线程编程的难度。

下面,针对新的线程并发包在Netty中的应用进行分析和说明,以期为大家的学习和应用提供指导。

首先看下线程安全容器在Netty中的应用。NioEventLoop是I/O线程,负责网络读写操作,同时也执行一些非I/O的任务。例如事件通知、定时任务执行等,因此,它需要一个任务队列来缓存这些Task。它的任务队列定义如图21-12所示。


图21-12  线程任务队列定义

它是一个ConcurrentLinkedQueue,我们看它的API说明,如图21-13所示。


图21-13  ConcurrentLinkedQueue线程安全文档

DOC文档明确说明这个类是线程安全的,因此,对它进行读写操作不需要加锁。下面我们继续看下队列中增加一个任务,如图21-14所示。


图21-14  ConcurrentLinkedQueue新增Task

读取任务,也不需要加锁,如图21-15所示。


图21-15  ConcurrentLinkedQueue读取Task

JDK的线程安全容器底层采用了CAS、volatile和ReadWriteLock实现,相比于传统重量级的同步锁,采用了更轻量、细粒度的锁,因此,性能会更高。合理地应用这些线程安全容器,不仅能提升多线程并发访问的性能,还能降低开发难度。

下面我们看看线程池在Netty中的应用,打开SingleThreadEventExecutor看它是如何定义和使用线程池的。

首先定义了一个标准的线程池用于执行任务,代码如下。


接着对它赋值并且进行初始化操作,代码如下。


执行任务代码如图21-16所示。


图21-16 SingleThreadEventExecutor任务执行

我们发现,实际上执行任务就是先把任务加入到任务队列中,然后判断线程是否已经启动循环执行,如果不是则需要启动线程。启动线程代码如图21-17所示。

实际上就是执行当前线程的run方法,循环从任务队列中获取Task并执行,我们看它的子类NioEventLoop的run方法就能一目了然,如图21-18所示。

如图21-19中框线内所示,循环从任务队列中获取任务并执行。


图21-17 SingleThreadEventExecutor启动新的线程


图21-18  按照I/O任务比例执行任务Task


图21-19  循环从任务队列中获取任务Task并执行

Netty对JDK的线程池进行了封装和改造,但是,本质上仍然是利用了线程池和线程安全队列简化了多线程编程。
0
0
查看评论

Java与Netty实现高性能高并发

http://blog.csdn.net/nicajonh/article/details/54985352 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂P...
  • zdy0_2004
  • zdy0_2004
  • 2017-02-13 14:36
  • 5402

netty 多线程用一个长连接(channel) 发送消息 并发安全吗?

 上面这段是 java SocketChannel 的注释 说明是安全的。
  • taotoxht
  • taotoxht
  • 2015-06-05 17:57
  • 1758

使用Netty构建一个多线程服务器与客户端

首先是服务器的初步实现.因为Netty是基于事件的,再加上其无阻塞的特性.我们必须要牢记:  数据发送后,代码不会被阻塞,而是顺序运行,也就是说,做了一件事件后,这件事情不一定已经成功,所以我们不能在下一行代码中百分百的确定其已经发送到了对方,因此,你会发行其很多方法都会返回一个&q...
  • Huang_Sun
  • Huang_Sun
  • 2017-06-19 17:56
  • 2114

Netty4版本升级血泪史之线程篇

1. 背景 1.1. Netty 3.X系列版本现状 根据对Netty社区部分用户的调查,结合Netty在其它开源项目中的使用情况,我们可以看出目前Netty商用的主流版本集中在3.X和4.X上,其中以Netty 3.X系列版本使用最为广泛。 Netty社区非常活跃,3.X系列版本...
  • zshake
  • zshake
  • 2016-01-12 16:39
  • 2529

对Java多线程在Netty中的应用的理解

对共享的可变数据同步经常使用Java的老司机都知道,synchronized关键字可以保证同一时刻只有一个线程执行某个方法或者代码块。同步的作用不仅仅是互斥,也是共享可变数据。当一个线程修改可变数据并释放锁后,其他线程可以获得修改后的新值。 下面以ServerBootstrap类为例来分析,该类的...
  • wangshuang1631
  • wangshuang1631
  • 2017-06-13 21:02
  • 1176

用Netty开发中间件:高并发性能优化

用Netty开发中间件:高并发性能优化最近在写一个后台中间件的原型,主要是做消息的分发和透传。因为要用Java实现,所以网络通信框架的第一选择当然就是Netty了,使用的是Netty 4版本。Netty果然效率很高,不用做太多努力就能达到一个比较高的tps。但使用过程中也碰到了一些问题,个人觉得都是...
  • dc_726
  • dc_726
  • 2015-10-08 20:52
  • 49959

Java异步NIO框架Netty实现高性能高并发

1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用。相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。 ...
  • gaowenhui2008
  • gaowenhui2008
  • 2017-02-13 09:33
  • 10162

多线程并发编程在Netty中的应用分析

  • 2016-03-17 16:17
  • 1.68MB
  • 下载

Netty 使用安全的连接即HTTPS连接

当需要使用安全的连接即HTTPS连接时,需配置SslHandler到ChannelPipeline,SslHandler无需另外写出,调用NETTY封装的即可,传入的SSLEngine在下面生成 package com.lin.socket.ssl; import java.security....
  • chen846262292
  • chen846262292
  • 2017-01-23 11:08
  • 3259

netty小例子

使用Netty传输POJO对象,重点在于对象的序列化,序列化后的对象可以通过TCP流进行网络传输,结合Netty提供的对象编解码器,可以做到远程传输对象。 下面我们来看一个例子:模拟订票 首先Java序列化的POJO对象需要实现java.io.Serializable接口。 说明:...
  • bestone0213
  • bestone0213
  • 2015-07-28 14:48
  • 462
    个人资料
    • 访问:3921930次
    • 积分:56482
    • 等级:
    • 排名:第57名
    • 原创:1462篇
    • 转载:83篇
    • 译文:1篇
    • 评论:3786条
    博客专栏
    文章存档
    最新评论