- 浏览: 274290 次
- 性别:
- 来自: 杭州
最新评论
-
天然呆的爱死你了呢:
herman_liu76 写道3) Handler执 ...
NIO+reactor模式的网路服务器设计方案 -
天然呆的爱死你了呢:
很棒,顶!
NIO+reactor模式的网路服务器设计方案 -
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
netty4源码分析-connect -
kyorisvc2012:
EventLoopGroup和EventLoop的继承关系感觉 ...
netty4服务端启动源码分析-线程的创建 -
herman_liu76:
3) Handler执行 task,读取客户端的请求 ...
NIO+reactor模式的网路服务器设计方案
文章列表
支持连接池的netty client核心功能实现剖析
本文为原创,转载请注明出处
源码地址:
https://github.com/zhangxianwu/light-netty-client
1、连接池
由于TCP连接的建立和关闭分别会经历三次握手和四次挥手,而三次握手和四次挥手都是系统开销很大的操作。如果每次一个新的请求发起时,都为其新建一个连接,在请求处理完毕后,再将这个新的连接关闭,这样处理的代价是高昂的,尤其是在请求本身的处理逻辑比较简单时,那么新建和关闭连接的开销在整个请求处理中占的比例就会越大。
因此,需要采用连接池,将连接缓存起来, ...
1、SFTP信用公钥配置
1.1 客户端生成密钥对
以DSA举例:
ssh-keygen –t dsa
执行该命令后,在home/用户名/.ssh目录下,会生成id_dsa和id_dsa.pub两个文件
1.2 将id_dsa.pub公钥文件上传至服务端的home/用户名/.ssh目录下
scp id_dsa.pub 用户 ...
1、 为什么要引入MCS锁?
在NUMA架构体系下,访问remote memory的速度要远远慢于访问local memory的速度。如下图所示(引自Companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit):
在前一篇文章中分析了CLH算法,由于每个线程都在其前驱线程的QNode节点的locked域自旋,在NUMA体系下,即每个线程都在其前驱线程的remote memory位置自旋,因此性能上会打折扣。
那么在NUMA体系下,如果每个 ...
本文为原创,转载请注明出处
1、为什么要引入CLH锁
在前一篇文章中,介绍了TAS、TTAS两种自旋锁。这两种锁的缺点是:任何一个处理器每一次对锁成功的访问(getAndSet(true)和set(false)任意一个方法的调用),都会将其 ...
本文为原创,转载请注明出处
1、两种自旋锁的实现:TAS和TTAS
1.1 TAS
class TasLock {
AtomicBoolean state = new AtomicBoolean(false);
void lock() {
while (state.getAndSet(true)) {
}
}
void unLock() {
state.set(false);
}
}
A ...
之前做的项目里涉及到了一些并发问题,今天总结一下
并发是由对共享资源的访问不当引起的,总的来说,常见的共享资源分为两大类:一种是数据库表中的行记录;一种是代码中的共享变量(譬如单例或者静态类型等等)。 ...
- 2014-04-26 09:48
- 浏览 482
- 评论(0)
1、两种自旋锁的实现:TAS和TTAS
1.1 TAS
class TasLock {
AtomicBoolean state = new AtomicBoolean(false);
void lock() {
while (state.getAndSet(true)) {
}
}
void unLock() {
state.set(false);
}
}
AtomicBoolean ...
- 2014-04-25 20:59
- 浏览 629
- 评论(0)
ExecutorCompletionService分析及使用
当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取:
方式一:
通过一个list来保存一组future,然后在循环中轮训这组future,直到每个future都已完成。如果我们不希望出现因为排在前面的任务阻塞导致后面先完成的任务的结果没有及时获取的情况,那么在调用get方式时,需要将超时时间设置为0
public class CompletionServiceTest {
static class Task implements Callab ...
闭锁/栅栏/信号量/FutureTask分析及使用
1、闭锁
用途:可用于命令一组线程在同一个时刻开始执行某个任务,或者等待一组相关的操作结束。尤其适合计算并发执行某个任务的耗时。
public class CountDownLatchTest {
public void timeTasks(int nThreads, final Runnable task) throws InterruptedException{
final CountDownLatch startGate = new CountDownLatch(1);
final Coun ...
本文为原创,转载请注明出处
基于echo例子的netty4通信总结
在netty4源码分析系列文章中分别详细介绍了echo例子中涉及到网络通讯的每一个环节,本文对echo例子中服务端和客户端依次发生的步骤做个总结:
服务端依次发生的步骤
建立服务端监听套接字ServerSocketChannel,以及对应的管道pipeline;
启动boss线程,将ServerSocketChannel注册到boss线程持有的selector中,并将注册返回的selectionKey赋值给ServerSocketChannel关联的selectionKey变量;
在ServerSo ...
本文为原创,转载请注明出处
Netty4源码分析- read
当selector检测到OP_READ事件时,触发read操作:
//NioEventLoop
if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) {
unsafe.read();
if (!ch.isOpen()) {
// Connection already closed ...
本文为原创,转载请注明出处
Netty4源码分析-flush Netty的写操作由两个步骤组成:
Write:将msg存 ...
本文为原创,转载请注明出处
netty 4源码分析-write
Netty的写操作由两个步骤组成:
Write:将msg存储到ChannelOutboundBuffer中
Flush:将msg从ChannelOutboundBuffer中flush到套接字的发送缓冲区中。
本文介绍第一个步骤write
//DefaultChannelHandlerContext
public ChannelFuture write(Object msg) {
return write(msg, newPromise());
}
public C ...
本文为原创,转载请注明出处
netty4源码分析-accept
本文分析服务端如何accept客户端的connect请求,首先看下selector的I/O多路复用的分发逻辑:
//NioEventLoop
private static void processSelectedKey(SelectionKey k, AbstractNioChannel ch) {
final NioUnsafe unsafe = ch.unsafe();
if (!k.isValid()) {
// close the ...
本文为原创,转载请注明出处
netty4源码分析-connect
客户端向服务端发起connect请求由以下代码触发:
ChannelFuture f = b.connect(host, port).sync();
调用Bootstrap的connect方法:
//Bootstrap
public ChannelFuture connect(String inetHost, int inetPort) {
return connect(new InetSocketAddress(inetHost, inetPort));
}
public ...