技术拾遗
Created|Updated
|Word Count:189|Reading Time:1mins|Post Views:
Java
Java 8
Lambda
Java 8 Lambdas - A Peek Under the Hood
What does $$ in javac generated name mean?
-
lambda 表达式并不总是持有外部 enclosing object 的引用,如果它不访问任何外部变量,即不持有这样的引用。只要设计一个对比实验,就会发现引用过外部变量的lambda实例才会产生一个 arg 的隐式参数引用。而内部类内部总是含有一个
this$0。 -
lambda表达式是词法作用域的-意思是不产生新的作用域,不产生任何shadowing问题。它可以无缝访问外部作用域的东西,就好像从一个 if block 里访问一个方法里的其他变量一样。但,同样地,不能声明新变量。
Author: magicliang
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles

2020-02-27
hive 汇总
Hive 操作符和函数汇总 Hive 架构概述 Hive 是构建在 Hadoop 之上的数据仓库基础设施,提供类 SQL 的查询语言 HQL,将查询转换为 MapReduce、Tez 或 Spark 任务执行。 核心组件 MetaStore 存储表的元数据信息,包括表结构、分区、列类型、序列化/反序列化规则等 支持多种存储后端:Derby(默认)、MySQL、PostgreSQL 可配置为远程服务模式,支持多客户端并发访问 Driver 接收查询请求,生成执行计划 编译器:解析 HQL,生成语法树,进行语义分析 优化器:基于规则和成本的查询优化 执行引擎:将逻辑计划转换为物理执行计划 执行引擎 MapReduce:早期默认引擎,适合大规模批处理 Tez:基于 DAG 的执行引擎,减少中间结果落盘 Spark:基于内存计算,显著提升查询性能 Hive 数据模型 Database 数据库是命名空间的逻辑容器,对应 HDFS 上的目录路径。 Table Hive 表分为两种类型: 管理表(内部表):删除表时删除元数据和数据 外部表:删除表时仅删除元数据,保留数据 Par...

2020-04-01
ThreadLocal 的设计模式
ThreadLocal 是 Java 并发编程中实现**线程封闭(Thread Confinement)**的核心工具。本文将从原理到实践,系统性地讲解 ThreadLocal 的设计哲学、内部机制、使用模式以及跨线程传递方案。 原理篇:ThreadLocal 的内部机制 核心设计理念:为什么不用 Map<Thread, Value>? 很多人初次设计线程本地存储时,会想到用一个全局的 Map<Thread, Value> 来存储每个线程的数据。但这种设计有致命缺陷:Thread 对象会被 Map 强引用,导致线程无法被 JVM 回收,造成严重的内存泄漏。 ThreadLocal 采用了相反的设计:让 Thread 持有 Map,而不是让 Map 持有 Thread。每个 Thread 内部都有一个 ThreadLocalMap,用于存储该线程的所有线程本地变量。这样设计的好处是: 线程销毁时,ThreadLocalMap 随之销毁,数据自动清理 ThreadLocal 对象可以被显式管理(如声明为静态变量) 线程内部的存储容器是隐式的,由线程自己管理 ...

2026-02-07
Maven 完全指南
本文整合了 Maven 构建生命周期、插件配置、依赖管理、全局配置 settings.xml、FatJar 打包、测试与覆盖率等全部知识点,是一份系统性的 Maven 参考指南。 maven-生命周期.xmind 构建生命周期 构建生命周期的基础知识 Maven 基于一个"构建生命周期"的中心概念,也就意味着构建和发布一个特定的工件(也就是工程)的过程已经被清晰地定义了。 有三种内置的生命周期:default,clean 和 site。default 生命周期处理项目部署,clean 生命周期处理项目清理,site 生命周期处理项目的站点(site)文档的创建。 graph TD subgraph Clean生命周期 A1[pre-clean] --> A2[clean] A2 --> A3[post-clean] end subgraph Default生命周期 B1[validate] --> B2[initialize] B2 -->...

2026-01-12
Java 并发编程笔记
juc.xmind 写在前面的话 并发编程最早的实践都在操作系统里。高层语言的并发模型都要基于底层系统对硬件抽象和并发的设计来设计和实现,不能超出操作系统允许的范围。所谓的高级抽象总体上是简化对 OS 底层机制的复杂调用。 并发与异步 本文聚焦并发(Concurrency),即多任务在同一时间段内的交替或并行执行,核心问题是资源共享、线程同步与协作。 **异步(Asynchronous)**是另一维度:调用方发起操作后不等结果返回即继续执行,通过回调、Future或事件机制获取结果。异步可通过单线程事件循环实现,也可依托多线程并发实现。 二者关系:并发关注"多任务如何执行与协调",异步关注"调用是否阻塞等待"。并发编程常涉及异步,但本文不展开异步编程模式(如响应式流、协程),相关内容请参阅《Java 线程池笔记》。 管程 理论和实践之间是有鸿沟的,要弥合这种鸿沟,通常需要我们去学习别人的实践。比如并发的标准设计思想来自于操作系统里的管程(monitor),我们应当学习管程,进而了解标准的并发模型-管理共享变量和线程(并发任务)间通信的基本...

2018-09-07
日期与时间
JSR 310 Java Date与Time API 新旧 API 的更迭 旧的 Java API 主要包括java.util.Date和java.util.Calendar 两个包的内容。这两个包的时间类型是可变的。如 Date 的实例可以通过 setYear 来产生变化。 JSR 310 中包括的日期类型主要有: 计算机时间:Instant,对应 java.util.Date,它代表了一个确定的时间点,即相对于标准Java纪元(1970年1月1日)的偏移量;但与java.util.Date类不同的是其精确到了纳秒级别。 人类时间:对应于人类自身的观念,比如LocalDate和LocalTime。他们代表了一般的时区概念,要么是日期(不包含时间),要么是时间(不包含日期),类似于java.sql的表示方式。此外,还有一个MonthDay,它可以存储某人的生日(不包含年份)。每个类都在内部存储正确的数据而不是像java.util.Date那样利用午夜12点来区分日期,利用1970-01-01来表示时间。这些类型的实例是 immutable 的,而且只能通过工厂方法创建。 时区...

2023-03-31
Spring Web
Spring MVC 把 httprequest 放入线程的过程 1234567891011public class ServletRequestAttributes extends AbstractRequestAttributes { /** * Create a new ServletRequestAttributes instance for the given request. * @param request current HTTP request */ public ServletRequestAttributes(HttpServletRequest request) { Assert.notNull(request, "Request must not be null"); this.request = request; }} 在 RequestContextFilter 的子类 OrderedRequestContextFilter: 123456789101112131415161718...
Contents