在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的线程池进行了封装和改造,但是,本质上仍然是利用了线程池和线程安全队列简化了多线程编程。

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

  1. java并发编程实践(2)线程安全性

    [0]README 0.0)本文部分文字描述转自:"java并发编程实战", 旨在学习"java并发编程实践(2)线程安全性" 的相关知识: 0.1)几个术语( ...

  2. auto.js停止所有线程_Java线程与并发编程实践:深入理解volatile和final变量

    同步有两种属性:互斥性和可见性.synchronized关键字与两者都有关系.Java同时也提供了一种更弱的.仅仅包含可见性的同步形式,并且只以volatile关键字关联. 假设你自己设计了一个停止线 ...

  3. 《Java线程与并发编程实践》—— 2.3 谨防活跃性问题

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.3节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  4. 《Java线程与并发编程实践》—— 2.6 小结

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.6节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  5. 《Java线程与并发编程实践》—— 1.2 操作更高级的线程任务

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第1章,第1.2节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  6. JAVA并发编程实践笔记

    2019独角兽企业重金招聘Python工程师标准>>> JAVA并发编程实践笔记 博客分类: java JAVA并发编程实践笔记 1, 保证线程安全的三种方法:     a, 不要跨 ...

  7. 《Java并发编程实践》学习笔记之一:基础知识

    <Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念:  (2)进程:是一种活动,它是由一个动作序列组成 ...

  8. Java并发编程实战_一线大厂架构师整理:java并发编程实践教程

    并发编程是Java语言的重要特性之一, 在Java平台上提供了许多基本的并发功能来辅助开发多线程应用程序.然而,这些相对底层的并发功能与上层应用程序的并发语义之间并不存在一种简单而直观的映射关系.因此 ...

  9. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  10. 并发编程实践三:Condition

    Condition实例始终被绑定到一个锁(Lock)上.Lock替代了Java的synchronized方法,而Condition则替代了Object的监视器方法,包含wait.notify和noti ...

最新文章

  1. 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级
  2. C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码
  3. Prototype(原型)--对象创建模式
  4. 【WebRTC---入门篇】(十五)WebRTC信令服务器实现
  5. js中 javascript:void(0) 用法详解
  6. Android添加拍照功能,Android相机开发(二): 给相机加上偏好设置
  7. 秒杀系统架构分析与实战(14155字,26图)
  8. 记录一下filter
  9. 牛逼!这个C++跳棋游戏居然可以让你边玩游戏边学编程!
  10. 写给0-3岁产品经理的第2封信:《产品经理的基本功——产品设计能力》
  11. java项目编码问题解决
  12. 内存数据库中的索引技术
  13. 物理服务器怎么装linux,新手如何在物理机上部署红帽linux系统
  14. 爬虫实战-python爬取QQ群好友信息
  15. 爬虫摸索中~~(PS:小小爬虫,何惧哉?且到明日,再看今朝。)
  16. i686-pc linux gnu,交叉编译: --host --build --target到底什么意思?
  17. python调用百度翻译api+离线语种检测
  18. 【程序员养成之路】Java基础篇 8-流进流出的IO流(二)
  19. [动图演示]Redis 持久化 RDB/AOF 详解与实践 1
  20. 【图像基础】帧与帧数

热门文章

  1. LeetCode 103——二叉树的锯齿形层次遍历
  2. Luogu1613 跑路
  3. HTML中行内元素与块级元素的区别:
  4. sdut Message Flood(c++ map)
  5. android打造一个简单的欢迎界面
  6. 菜鸟上路-Web开发模式
  7. C# Tostring() 格式大全
  8. MYSQL获取自增ID的四种方法
  9. 20171103_Python学习三周五次课
  10. Android SDK的安装教程