并发译文 ’ 目录归档

并发编程图书

Java NIO系列教程(六) Selector

原文链接 作者:Jakob Jenkov 译者:浪迹v 校对:丁一

Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。

下面是本文所涉及到的主题列表:

  1. 为什么使用Selector?
  2. Selector的创建
  3. 向Selector注册通道
  4. SelectionKey
  5. 通过Selector选择通道
  6. wakeUp()
  7. close()
  8. 完整的示例

阅读全文

Java NIO系列教程(十) Java NIO DatagramChannel

原文链接    作者:Jakob Jenkov    译者:郑玉婷     校对:丁一

Java NIO中的DatagramChannel是一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。它发送和接收的是数据包。

阅读全文

Java NIO系列教程(一) Java NIO 概述

原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一

Java NIO 由以下几个核心部分组成:

  • Channels
  • Buffers
  • Selectors

虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。因此,在概述中我将集中在这三个组件上。其它组件会在单独的章节中讲到。

阅读全文

Java NIO系列教程(七) FileChannel

原文链接     作者:Jakob Jenkov     译者:周泰      校对:丁一

Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。

FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。

阅读全文

Java NIO系列教程(二) Channel

原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一

Java NIO的通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步地读写。
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:

阅读全文

Java NIO系列教程(三) Buffer

原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一

Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。

缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。

下面是NIO Buffer相关的话题列表:

  1. Buffer的基本用法
  2. Buffer的capacity,position和limit
  3. Buffer的类型
  4. Buffer的分配
  5. 向Buffer中写数据
  6. flip()方法
  7. 从Buffer中读取数据
  8. clear()与compact()方法
  9. mark()与reset()方法
  10. equals()与compareTo()方法

阅读全文

Java NIO系列教程(八) SocketChannel

原文链接     作者:Jakob Jenkov     译者:郑玉婷      校对:丁一

Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:

  1. 打开一个SocketChannel并连接到互联网上的某台服务器。
  2. 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。

阅读全文

Java NIO系列教程(十一) Pipe

原文链接     作者:Jakob Jenkov     译者:黄忠       校对:丁一

Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。

这里是Pipe原理的图示:

阅读全文

Java NIO系列教程(九) ServerSocketChannel

原文链接     作者:Jakob Jenkov     译者:郑玉婷      校对:丁一

Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。

阅读全文

Java NIO系列教程(四) Scatter/Gather

原文地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html

作者:Jakob Jenkov   译者:郭蕾   

Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。
分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。
聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。

scatter / gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。
阅读全文

Java NIO 系列教程

原文地址 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞

Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。

Java NIO: Channels and Buffers(通道和缓冲区)

标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

Java NIO: Non-blocking IO(非阻塞IO)

Java NIO可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。

Java NIO: Selectors(选择器)

Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。
下面是Java NIO系列文章的目录:Java NIO Tutorial

  1. Java NIO 教程
  2. Java NIO概述
  3. Java NIO Channel
  4. Java NIO Buffer
  5. Java NIO Scatter / Gather
  6. Java NIO 通道之间的数据传输
  7. Java NIO Selector
  8. Java NIO FileChannel
  9. Java NIO SocketChannel
  10. Java NIO ServerSocketChannel
  11. Java NIO 非阻塞式服务器
  12. Java NIO DataGramChannel
  13. Java NIO Pipe
  14. Java NIO 与IO
  15. Java NIO Path (待翻译)
  16. Java NIO Files (待翻译)
  17. Java NIO AsynchronousFileChannel (待翻译)

合并写(write combining)

原文地址 译者:无叶 校对:丁一

现代CPU采用了大量的技术来抵消内存访问带来的延迟。读写内存数据期间,CPU能执行成百上千条指令。

多级SRAM缓存是减小这种延迟带来的影响的主要手段。此外,SMP系统采用消息传递协议来实现缓存之间的一致性。遗憾的是,现代的CPU实在是太快了,即使是使用了缓存,有时也无法跟上CPU的速度。因此,为了进一步减小延迟的影响,一些鲜为人知的缓冲区派上了用场。

本文将探讨“合并写存储缓冲区(write combining store buffers)”,以及如何写出有效利用它们的代码。

CPU缓存是一种高效的非链式结构的hash map,每个桶(bucket)通常是64个字节。这就是一个“缓存行(cache line)”。缓存行是内存交换的实际单位。例如,主存中地址A会映射到一个给定的缓存行C。

阅读全文

有关“双重检查锁定失效”的说明

原文地址 译者:丁一

双重检查锁定(以下称为DCL)已被广泛当做多线程环境下延迟初始化的一种高效手段。

遗憾的是,在Java中,如果没有额外的同步,它并不可靠。在其它语言中,如c++,实现DCL,需要依赖于处理器的内存模型、编译器实行的重排序以及编译器与同步库之间的交互。由于c++没有对这些做出明确规定,很难说DCL是否有效。可以在c++中使用显式的内存屏障来使DCL生效,但Java中并没有这些屏障。

阅读全文

Java HotSpot VM中的JIT编译


原文地址译者:郭蕾 校对:丁一

本文是Java HotSpot VM and just-in-time(JIT) compilation系列的第一篇。

Java HotSpot虚拟机是Oracle收购Sun时获得的,JVM和开源的OpenJDK都是以此虚拟机为基础发展的。如同其它虚拟机,HotSpot虚拟机为字节码提供了一个运行时环境。实际上,它主要会做这三件事情:

  • 执行方法所请求的指令和运算。
  • 定位、加载和验证新的类型(即类加载)。
  • 管理应用内存。

最后两点都是各自领域的大话题,所以这篇文章中只关注代码执行。

阅读全文

return top