作者归档

【iFeve】并发网技术沙龙集锦(含视频)

【先做个小广告:企业技术品牌建设,举办沙龙或者企业内部技术培训,请联系guolei@ifeve.com】

周日那天北京的天气不是很好,看着要下大雨。秋风中偶尔能感觉到丝丝凉意,不过妹子们还是穿短裤,一下子也就热了。沙龙是在车库咖啡举行的,车库咖啡是创业者的聚集地,它所在的那条街也改为叫中关村创业大街了。

此次参加沙龙的朋友一共186人(不包含未签到的),好吉利的数字。这次是iFeve的第一次,我们想做一场不一样的沙龙,我们想像做内容一样做沙龙。

本次活动的PPT在这里。感谢我们的协办方Coding、七牛云。下面是一些精彩合集,视频地址如下:

1. 并发编程实战
2. 如何优化Java应用
3. Go的并发之美

阅读全文

并发编程网线下沙龙

今天下午正式举行,感谢各位的支持!

沙龙背景

马上就是并发编程网(ifeve.com)三岁生日了,首先感谢各位读者粉丝对我们的大力支持和鼓励!三年来,我们共组织翻译了600余篇文章,其中DisruptorNIONettyStorm并发编程JSR133Doug Lea并发论文等系列文章均得到了官方和读者的认可和好评。欣喜于取得如此成绩的同时,更让我们觉得在创造精品文章的路上,我们还有很长的路要走,我们一直在努力!

在三周年到来之际,并发编程网联合Coding.net七牛GreenTeaJUG举办第一场线下沙龙,主题是“并发编程”,号召对并发编程感兴趣的粉丝汇聚一堂,认我们煮酒论“编程”!

阅读全文

Java 8新特性:字符串去重

本文首发与InfoQ

8月19日,Oracle发布了JDK 8u20,JDK 8u20包含很多新特性,比如Java编译器更新、支持在运行时通过API来修改MinHeapFreeRatio和MaxHeapFreeRatio参数、新的GC调优指南文档。不过在众多新特性中,最令人期待的还属字符串去重(String Deduplication )。如何减少内存占用一直是一个永恒的话题,而在Java应用中,经常会看到String对象会占用应用30%的内存,它是Java中最常用的对象之一。新的字符串去重特性可以帮助减少应用中String对象的内存占用,目前该特性只适用于G1垃圾收集器,并且默认不被开启。

阅读全文

我和Netty的故事

本文首发于InfoQ架构师杂志。

还在上学的时候,我特别好奇QQ是怎么实现的,为什么我一发消息我的好友马上就能收到且基本没有延迟,它的原理是什么?大三的时候,我学习了Java语言,接触到了Socket编程,不知天高地厚的我当时居然想自己实现个简易QQ,和几个朋友做了技术评估后觉得这个事好像不是那么难,紧接着我们就用Swing以及一些Socket编程知识完成了一个简易的局域网QQ,虽然功能不是那么的稳定,但基本上还是可以实现私聊、群聊、文件传输、抖屏功能。这也许是我第一次接触网络通信,核心功能部分使用了同步I/O的Socket类库。

阅读全文

聊聊JVM的年轻代

1.为什么会有年轻代

我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。

阅读全文

Java 8学习资料汇总

本文首发于InfoQ

Java 8发布已经有一段时间,它被认为是Java 5发布以来最大的一次版本升级。Java 8 为Java语言、编译器、类库、开发工具以及JVM(Java虚拟机)带来了大量新特性。Lambda表达式、默认方法、并行API等都受到了开发者的追捧,社区上关于Java 8的学习资料如雨后春笋般涌现。下面是一些优秀的学习资料汇总:

阅读全文

OAuth 2.0系列教程

作者:Jakob Jenkov   译者:林浩    校对:郭蕾 

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

阅读全文

Java SE 8 在并发工具方面的加强

本文首发于InfoQ

Java 8在Lambda表达式、接口默认方式、新的日期API等方面引入的新特性广受关注,同时在并发编程方面也做出了大量改进。以往的几个Java版本都对java.util.concurrent做了不同程度的增强,比如Java 7的Fork/Join框架,而Java 8则进一步在java.util.concurrent下增加了新的接口、类与方法。目前java.util.concurrent的官方文档已经更新,变更部分总结如下: 阅读全文

Java NIO系列教程(五) 通道之间的数据传输

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

作者:Jakob Jenkov   译者:郭蕾     校对:周泰

在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。

transferFrom()

FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中)。下面是一个简单的例子:

[code lang=”java”]
RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();

RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
FileChannel toChannel = toFile.getChannel();

long position = 0;
long count = fromChannel.size();

toChannel.transferFrom(position, count, fromChannel);
[/code]

方法的输入参数position表示从position处开始向目标文件写入数据,count表示最多传输的字节数。如果源通道的剩余空间小于 count 个字节,则所传输的字节数要小于请求的字节数。
此外要注意,在SoketChannel的实现中,SocketChannel只会传输此刻准备好的数据(可能不足count字节)。因此,SocketChannel可能不会将请求的所有数据(count个字节)全部传输到FileChannel中。

transferTo()

transferTo()方法将数据从FileChannel传输到其他的channel中。下面是一个简单的例子:

[code lang=”java”]
RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");
FileChannel fromChannel = fromFile.getChannel();

RandomAccessFile toFile = new RandomAccessFile("toFile.txt", "rw");
FileChannel toChannel = toFile.getChannel();

long position = 0;
long count = fromChannel.size();

fromChannel.transferTo(position, count, toChannel);
[/code]

是不是发现这个例子和前面那个例子特别相似?除了调用方法的FileChannel对象不一样外,其他的都一样。
上面所说的关于SocketChannel的问题在transferTo()方法中同样存在。SocketChannel会一直传输数据直到目标buffer被填满。

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 (待翻译)

JIT与可见性

原文地址 (被墙移到墙内)

 Overview

Many developers of multi-threaded code are familiar with the idea that different threads can have a different view of a value they are holding, this not the only reason a thread might not see a change if it is not made thread safe.  The JIT itself can play a part.

Why do different threads see different values?

When you have multiple threads, they will attempt to minimise how much they will interact e.g. by trying to access the same memory.  To do this they have a separate local copy e.g. in Level 1 cache.  This cache is usually eventually consistent.  I have seen short periods of between one micro-second and up to 10 milli-seconds where two threads see different values.  Eventually the thread is context switched, the cache cleared or updated.  There is no guarantee as to when this will happen but it is almost always much less than a second. 阅读全文

Java HotSpot VM中的JIT编译


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

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

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

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

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

阅读全文

什么是上下文切换

原文:http://www.wisegeek.com/what-is-context-switching.htm     译者:郭蕾 校对:方腾飞

支持多任务处理是CPU设计史上最大的跨越之一。在计算机中,多任务处理是指同时运行两个或多个程序。从使用者的角度来看,这看起来并不复杂或者难以实现,但是它确实是计算机设计史上一次大的飞跃。在多任务处理系统中,CPU需要处理所有程序的操作,当用户来回切换它们时,需要记录这些程序执行到哪里。上下文切换就是这样一个过程,他允许CPU记录并恢复各种正在运行程序的状态,使它能够完成切换操作。 阅读全文

return top