走近 JavaJava虚拟机发展史Sun HotSpot VM在2006年的JavaOne大会上,Sun公苛宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpotVM)在GPL协议下公开了源码,并在此基础上建立了OpenJDK。这样,HotSpotVM便成为了Sun JDK和Open JDK两个实现极度接近的JDK项目的共同虚拟机。
在2008年和2009...
Continue reading
分工原则从顺序到并发如何估计需要创建多少个线程、如何分解问题以及如何估算性能提升的程度。
确定线程数阻塞系数 : 任务有处于阻塞状态占总处理时间的百分比
计算密集型任务的阻塞系数为0 , 而IO密集型任务的阻塞系数则接近1
可以采用一些性能分析工具或java.lang.management API来确定线程花在系统IO操作上的时间与CPU密集任务所耗时间的比值
线程数 = CPU可用核心数 / (...
Continue reading
Continue reading
设计方法处理状态
共享可变性(Shared Mutability)
隔离可变性(Isolated Mutability)
纯粹不可变性(Pure Immutability)
不可变的数据结构在采用面向对象分解方式的应用程序中实现纯粹不可变性设计要比在采用函数式分解的应用程序中更难实现。需要设计更符合不可变性的算法,应用递归结构或函数式组合以及持久化数据结构,才有可能真正实现纯粹不可变性设计...
Continue reading
Continue reading
驯服共享可变性显示同步
请不要随意创建线程,而是使用线程池来降低任务启动时间和资源消耗
通过正确评估程序所需要的锁的粒度来提高程序的并发度。请确认你当前所使用的锁是否过于保守,如果是的话请将其调整为合适的粒度,以便能够同时满足程序对线程安全和并发度的双重需求。
当需要同时使用多个可变字段时,请核实对这些变量的访问是否是原子的,也就是说,要保证其他线程不会看到这些变量的部分修改结果(parti...
Continue reading
Continue reading
软件事务内存对象模型的缺陷作为一个java程序员,我们对面向对象的编程(OOP)自然都是烂熟于胸的,但语言也极大地影响了我们对面向对象应用程序的建模方式。现在的OOP已经和AlanKay当初创造这个词时候的初衷大不相同了。他的主要思想是采用消息传递并消灭所有数据(他认为,系统是由一些类似于生物细胞那样的对象构成的,这些对象通过消息传递进行通信,且无需持有任何状态)。随着这一技术的演进,面向对象的语...
Continue reading
Continue reading
可扩展性和线程安全## 用ExecutorService管理线程
每个ExecutorService都代表一个线程池,其作用是将线程的创建与执行了过程分离开来,而不是将线程的生命周期管理和任务的执行过程绑在一起。我们可以按需配置线程池的类型,单线程的、带缓存的、基于优先级的、按预定时间调度/按周期调度的和固定大小的,待调度任务的等待队列的大小亦可通过代码进行配置。通过这组API,我们可以很容易地调...
Continue reading
Continue reading
NIO基础知识Linux网络I/O模型简介根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型
阻塞I/O模型
非阻塞I/O模型
I/O复用模型select/poll 进程通过将一个或多个fd传递给select或poll系统调用
I/O多路复用技术
支持一个进程打开的socket描述符(FD)不受限制(仅受限于操作系统的最大文件句柄数)
I/O效率不会随着FD数目的增加而...
Continue reading
Continue reading
netty入门netty服务端和客户端开发服务端主流程123456789101112131415161718192021222324// 配置服务端Reactor线程组// 一个用于服务端接受客户端的连接EventLoopGroup bossGroup = new NioEventLoopGroup();// 用于进行SocketChannel的网络读写EventLoopGroup workerG...
Continue reading
Continue reading
TCP粘包拆包问题TCP粘包/拆包TCP粘包/拆包问题说明假设客户端分别发送了两个数据包Dl和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下5种情况。
服务端分两次读取到了两个独立的数据包,分别是D1和D2,没有粘包和拆包
服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包
服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,...
Continue reading
Continue reading
解码器LineBasedFrameDecoderLineBasedFrameDecoder的工作原理足它依次遍历ByteBuf中的可读字节,判断看是否有“\n”或者“\r\n”,如果有,就以此位置为结束位置,从可读索引到结束位置区间的字节就组成了一行。它是以换行符为结束标志的解码器,支持携带结束符或者不携带结束符两种解码方式,同时支持配置单行的最大长度。如果连续读取到最大长度后仍然没有发现换行符,...
Continue reading
Continue reading