Hans Dev

  1. 首页
  2. Hans 发布的文章

双重校验锁被广泛用作一种多线程环境中高效的懒加载实现。然而,当在Java中被以平台无关的形式实现时,在没有额外的同步措施的情况下,它将是不可靠的。当它在其他语言如C++中被实现时,它的可靠与否取决于处理器的内存模型,编译器进行的指令重排序以及编译器与同步库的交互。由于以上几点都未在语言规范中被明确定义(如C++),我们无法确定双重校验锁在什么情况下有效。在C++中,可以使用显式的内存屏障来使双重校验锁正确工作,但是这些屏障在Java中并不可用。

四种线程池:

Worker内部类:

当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。

注意

以上8种操作都是原子的,不可再分的,且执行上述基本操作时必须满足下列规则:

热点方法:方法调用计数器用于统计方法被调用的次数,当计数器的值超过阈值时,那么将会向即时编译器提交一个该方法的代码编译请求,而后方法将被继续解析执行,直到编译完成,系统会自动改写方法的调用入口地址。

动态连接指在每一次运行期间将方法的符号引用转化为直接引用的。与之相对应的是静态解析,在类加载阶段或第一次使用时就转化为直接引用。

验证,准备,解析三个部分统称为连接。

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段。注意对于静态变量设置初始值不是设置类变量被赋予的值,基本数据类型为对应的零值,引用类型为null;对于常量(即带有final修饰符的静态变量)则会直接设置其被赋予的值。

类文件结构Class 类文件的结构魔数和Class文件的版本常量池访问标志类索引,父类索引与接口索引集合字段表集合方法表集合属性表集合类型名称数量u4magic1u2minor_version1u2major_version1u2constant_pool_count1cp_infoconstant_poolconstant_pool_count-1u2access_flags1u2this_class1u2super_class1u2interfaces_count1u2interfacesinterfaces_countu2fields_count1field_infofiledsf...

中断:

并行收集器与并发收集器

可达性分析:以GC Root为起始点,向下搜索,搜索走过的路径称为引用链,当从GC Root到对象不可达时,该对象为孤立对象,即可回收。

GC Root:

虚拟机栈:线程私有,存储栈帧。

虚拟机栈:

这是我近期正在开发的ECHO Pilot Client中使用的Socket通信客户端封装,基于System.Net.Socket.TcpClient(不是继承)。主要是根据ECHO的需求封装了部分操作,添加了Connected/Disconnected/StateChanged/DataReceived/ExceptionThrown事件,使得客户端可以根据各个事件更加灵活地做出响应。