java_snippet
123456789101112131415161718192021222324252627282930313233public abstract class BaseHandlerFactory<T> { protected final Map<String, T> handlers = new HashMap<>(); public void register(String key, T handler) { handlers.put(key, handler); } public T get(String key) { return handlers.get(key); } public T exist(String key) { if (handlers.containsKey(key)) { return handlers.get(key); ...
Commander
开发文档 | Commander 中文网 安装 Installation 1npm install commander 快速入门 Quick Start 你编写代码来描述你的命令行接口。Commander 将参数解析为选项和命令参数,显示问题的使用错误,并实现帮助系统。 You write code to describe your command line interface. Commander looks after parsing the arguments into options and command-arguments, displays usage errors for problems, and implements a help system. Commander 很严格,对无法识别的选项显示错误。最常用的两种选项类型是布尔选项和从以下参数中获取其值的选项。 Commander is strict and displays an error for unrecognised options. The two most used option types...
powershell环境重新加载环境变量
在 PowerShell 中刷新环境变量 重新加载 Path 环境变量 Path 是最常见需要修改的环境变量。当我们添加新的路径到 Path 后,通常需要让 PowerShell 立即识别这些新的路径,而不是依赖重新启动系统或 PowerShell 会话。 使用以下命令可以重新加载 Path 环境变量: 1$env:Path = [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine) + ";" + [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::User) 命令解释: $env:Path: 这是 PowerShell 中的环境变量 Path。 [System.Environment]::GetEnvironmentVariable(“Path”,...
WSL安装kali
WSL安装kali 安装 安装的非C盘位置 1wsl --install -d kali-linux --name kali --location E:\Hyper\kali\ 修改软件源 1sed -i "s@http://http.kali.org/kali@https://mirrors.tuna.tsinghua.edu.cn/kali@g" /etc/apt/sources.list 安装图形化功能 1sudo apt install -y kali-win-kex 从Windows终端中启动界面 1wsl -d kali kex --esm --wtstart -s
Netty Recycler
Recycler 转载 bin的技术小屋 本系列Netty源码解析文章基于 4.1.56.Final版本 1....
Netty FastThreadLocal
FastThreadLocal 对别 JDK Netty Thread FastThreadLocalThread ThreadLocal FastThreadLocal ThreadLocalMap InternalThreadLocalMap 区别 区别 ThreadLocal FastThreadLocal 存储结构 Map<WeakReference<ThreadLocal<?>,Object>> Object[] 数组下标作为索引, Object 存储Value 内存占用 重复对象可以进行覆盖 每次创建会新建下标,不会利用被删除的位置,数组只会扩容,无法缩容 性能 可能产生hash碰撞,线性探测法在解决 Hash 冲突时需要不停地向下寻找,效率较低 定位数据的时候可以直接根据数组下标 index 获取,时间复杂度 O(1) 回收 手动调用Remove 进行回收 1. 自动,执行一个被FastThreadLocalRunnable...
ByteBuddy
ByteBuddy 12345<dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy</artifactId> <version>1.11.12</version> </dependency> Hello World 1234567891011Class<?> dynamicType = new ByteBuddy() .subclass(Object.class) .method(ElementMatchers.named("toString")) .intercept(FixedValue.value("Hello World")) .make() ...
ThreadLocal
ThreadLocal ThreadLocal ThreadLocal 提供线程局部变量,即为使用相同变量的每一个线程维护一个该变量的副本。当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用 ThreadLocal,比如数据库连接 Connection,每个请求处理线程都需要,但又不相互影响,就是用 ThreadLocal 实现。 为何要Entry使用用弱引用 如果使用强引用,情况会如下: ThreadLocalMap 作为 Thread 的成员变量,会随 Thread 一直保留。 ThreadLocalMap 的 key 是 ThreadLocal 对象,如果使用强引用,ThreadLocal 对象会被 ThreadLocalMap 强引用,无法被回收。 而 ThreadLocal 对象可能是唯一对某个对象的引用,这会导致这个对象也无法被回收,发生内存泄露。 使用弱引用可以避免这种情况: 当 ThreadLocal 对象没有其他强引用时,由于 ThreadLocalMap 中的引用是弱引用,ThreadLocal...
thread
thread 概述 并发与并行 并行:指两个或多个事件在同一时刻发生(同时发生)。 并发:指两个或多个事件在同一个时间段内发生。 进程、线程 进程是正在运行的程序的实例。 进程是线程的容器,即一个进程中可以开启多个线程。 线程是进程内部的一个独立执行单元; 一个进程可以同时并发运行多个线程; 线程生命周期 1. 新建 new 关键字创建了一个线程之后,该线程就处于新建状态 JVM 为线程分配内存,初始化成员变量值 就绪 当线程对象调用了 start()方法之后,该线程处于就绪状态 JVM 为线程创建方法栈和程序计数器,等待线程调度器调度 运行 就绪状态的线程获得 CPU 资源,开始运行 run()方法,该线程进入运行状态 阻塞 线程在等待进入临界区 无限期等待 处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。 限期等待 处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。 死亡 线程会以如下 3...
并发锁
并发锁 根据分类标准我们把锁分为以下 7 大类别,分别是: 偏向锁/轻量级锁/重量级锁:这三种锁特指 synchronized 锁的状态,通过在对象头中的 mark word 来表明锁的状态。 偏向锁 如果自始至终,对于这把锁都不存在竞争,那么其实就没必要上锁,只需要打个标记就行了,这就是偏向锁的思想。一个对象被初始化后,还没有任何线程来获取它的锁时,那么它就是可偏向的,当有第一个线程来访问它并尝试获取锁的时候,它就将这个线程记录下来,以后如果尝试获取锁的线程正是偏向锁的拥有者,就可以直接获得锁,开销很小,性能最好。 重量级锁 重量级锁是互斥锁,它是利用操作系统的同步机制实现的,所以开销相对比较大。当多个线程直接有实际竞争,且锁竞争时间长的时候,轻量级锁不能满足需求,锁就会膨胀为重量级锁。重量级锁会让其他申请却拿不到锁的线程进入阻塞状态。 轻量级锁 JVM 开发者发现在很多情况下,synchronized 中的代码是被多个线程交替执行的,而不是同时执行的,也就是说并不存在实际的竞争,或者是只有短时间的锁竞争,用 CAS...