System.console()特殊实现原因解析:变量c的赋值意义探究
解析System.console()中多次赋值变量c的原因
这段代码是典型的**双重检查锁定(Double-Checked Locking)**实现,用来懒加载控制台单例,多次给局部变量c赋值主要是为了性能优化和代码简洁性,具体拆解如下:
减少共享变量的访问开销
静态变量cons是跨线程共享的,且Java标准库中System.cons被标记为volatile,每次读取都需要内存同步,开销远大于读取栈上的局部变量。用局部变量c缓存cons的值后,后续的空判断和赋值操作都基于这个局部缓存,避免了重复读取共享变量的性能损耗。简化空判断逻辑
把c = cons和== null合并成(c = cons) == null,一行代码完成“读取共享变量到局部缓存”+“判断是否为空”两个动作,让双重检查的逻辑更紧凑。如果拆成两行写,代码会冗余很多,原写法在逻辑等价的前提下让代码更简洁。保证返回值的稳定性
最终返回的是局部变量c而非直接返回cons,这是一种防御性编程。虽然cons一旦被赋值就不会再修改,但返回局部变量能确保当前线程拿到的是自己初始化流程中获取的实例,避免极端情况下的不一致问题。
另外补充:双重检查锁定在Java 5之前存在指令重排序的问题,但这段代码通过局部变量缓存+volatile修饰cons,已经解决了这个问题,是安全的懒加载实现。
内容的提问来源于stack exchange,提问作者Milchshakee
相关产品推荐
相关产品推荐

