Netty入门
二. Netty 入门1. 概述1.1 Netty 是什么?12Netty is an asynchronous event-driven network application frameworkfor rapid development of maintainable high performance protocol servers & clients. Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端 1.2 Netty 的作者 他还是另一个著名网络应用框架 Mina 的重要贡献者 1.3 Netty 的地位Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位 以下的框架都使用了 Netty,因为它们有网络通信需求! Cassandra - nosql 数据库 Spark - 大数据分布式计算框架 Hadoop - 大数据分布式存储框架 RocketMQ - ali 开源的消息队列 ElasticSearch - 搜索引擎 gRPC - rpc 框架 Dubb...
Git常用命令
Git命令集合1. 提前配置12git config --global user.name USERNAME #配置用户名git config --global user.email USEREMAIL #配置用户邮箱 2. 提交步骤12345git init #初始化git仓库git status #查看文件状态git add #添加到缓存区,追踪文件git commit -m MESSAGE #提交信息,向仓库中提交代码git log #查看提交记录 3. Git撤销123git checkout FILENAME #用暂存区的文件覆盖工作目录中的文件git rm --cached FILENAME #将文件从暂存区删除git reset --hard COMMITID #将git仓库中指定的更新记录恢复出来,并覆盖暂存区和工作目录 4. Git分支1234567git branch #查看分支git branch 分支名称 #创建分支git checkout 分支名称 #切换分支git merge 来源分支 #合并分支git bran...
ReentrantLock详解(一)—— 加锁和解锁
本文将从以下角度来介绍ReentrantLock: ReentrantLock介绍; ReentrantLock与synchronized的关系; ReentrantLock的原理; 1. ReentrantLock介绍JDK1.5新增了并发包,里面包含Lock接口,与synchronized关键字一样能实现同步功能。但相比synchronized,Lock更加灵活,可以手动获取、释放锁,而ReentrantLock就是Lock的一个实现类。接下来先介绍其基本使用。 1.1 ReentrantLock的基本使用以下是一段是使用5个线程,并发对count做加一操作。使用ReentrantLock来保证线程安全。 123456789101112131415161718192021222324252627282930class AddRunnable implements Runnable{ @Override public void run() { for (int i = 0; i < 10000; i++) ...
Semaphore详解
本文我们来讨论Semaphore的用法与原理。如果有学习过之前讨论过的[[CountDownLatch详解|CountDownLatch]]、[[CyclicBarrier详解|CyclicBarrier]]的内容,那么本文的阅读难度会非常低。接下来将从用法和源码两个方面来进行讨论。 1. 用法我们可以将Semaphore理解为一个资源池,共有n个许可证,每个线程要执行指定操作时,去获取许可证,如果获取不到许可证,则阻塞。拿到许可证执行完操作后需要及时地释放(归还)许可证。如JavaDoc中的代码: 123456789101112131415161718192021222324252627282930313233343536373839404142class Pool { private static final int MAX_AVAILABLE = 100; private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); public Object getIte...
Learning to Classify A Flow Based Relation Network for Encrypted Traffic Classification
加密流量分类的挑战性问题: 网络数据的不平衡性 模型对真实数据的泛化能力 模型对数据大小的过度依赖。 1、概念介绍1.1 流量加密背景加密技术虽然保护了互联网用户的自由、隐私和匿名性,但也用户避开了防火墙的检测,绕过了监控系统。 由此导致的问题: 攻击者通过加密恶意软件流量来匿名入侵和攻击系统。 犯罪分子使用隐私增强工具(例如Tor)穿透黑暗网络,在那里他们可以购买毒品、武器和伪造的文件(如护照、驾照、提供合同杀手的媒体)来吸引客户. 1.2 流量分类技术的发展(综述部分) 基于端口号 基于有效载荷,也就是DPI方法。1,2只能针对非加密流量 基于流统计特征的方法,分类性能取决于人类的特征工程 基于深度学习的方法: 优点:端到端、具有相当高的学习能力 缺点: 不能解决数据中类的不均衡问题 训练好的模型不能很好适用于真是流量环境,泛化能力差 过分依赖数据集的大小与数据分布的好坏 1.4 文章核心观点引入对于一个新奇概念的样本,人类可以轻易根据对事物共同变化模式的了解,想象该样本在其他环境的样子。如果机器从辨别出在不同环境(原文这里称作幻觉(hallucinat...
ReentrantLock详解(二)
上一篇[[ReentrantLock详解(一)—— 加锁和解锁]]讲了ReentrantLock的基本使用,和比较基础的加解锁原理以及流程。本文来继续讨论剩下的一些比较重要的部分。有: 公平锁和非公平锁的实现区别; 绑定条件阻塞和唤醒的实现,解析AQS中的ConditionObject; 1. 公平锁和非公平锁^b9c966 ReentrantLock在创建的时候,可以指定其是否为公平锁。默认为非公平锁(非公平锁的性能相对较高),构造函数传false则为公平锁。 123public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } 两者大部分实现都是一致的,只有在加锁的时候略有区别。源码如下: 1.1 公平锁1234567891011121314151617181920212223242526272829303132// 由于之前的文章已经讨论过公平锁的源码,因此不再重复注释。final void lock() {...
ThreadLocal详解
在多线程环境下,解决线程安全问题的方案主要分三个方案:互斥同步(如Syncrhonize)、非阻塞同步(如CAS)、线程封闭(局部变量、ThreadLocal)。本文将讨论其中的ThreadLocal的实现原理。 1. ThreadLocal是什么ThreadLocal是一个线程级别的变量,主要用于多线程环境下,无需线程间共享的变量。当每个线程都维护属于自己线程的变量,线程间是隔离的,那么也就彻底消除了线程间的竞争,消除了线程安全问题。 ThreadLocal的使用方法很简单,如下: 1234567891011121314151617public static void main(String[] args) throws InterruptedException { ThreadLocal<Integer> threadLocal = new ThreadLocal<>(); ExecutorService service = Executors.newSingleThreadExecutor(); s...
InnoDB中的Change Buffer是个啥?
Change Buffer 是作为InnotDB的一个优化技术,用于减少对MySQL的磁盘IO操作,从而提升磁盘性能。本文将从一个解决问题的角度来了解一下Change Buffer是个啥。 1. Change Buffer总览众所周知,存储引擎瓶颈有很大一部分来源于对磁盘的随机IO操作。那么对于频繁的随机磁盘IO操作有哪些优化方案呢? 一般情况下,最常见的思路就是,直接加一层读缓存即可,此方案实现起来并不是很复杂。 但是,如果能让写请求也减少与磁盘的IO操作,那性能不是能再提升一步吗?没错,Change Buffer就是针对此方案的成果。整体的结构总览如下: 官方文档中,对Change Buffer的定义如下:更改缓冲区是一种特殊的数据结构,当二级索引页不在缓冲池中时,它会缓存对二级索引页的更改。可能由INSERT、UPDATE或DELETE(DML) 操作导致的缓冲更改,稍后在其他读取操作将页面加载到缓冲池时合并。 注意: 这里为什么声明了二级索引?不要着急,后面会解释。 接下来我们看看它的工作流程。 2. Change Buffer的工作流程假定一个场景,要对...
JVM中常见的垃圾回收算法
了解垃圾回收算法前,需要先了解评价垃圾回收算法的评价标准和指标。有以下几点: 吞吐量 最大暂停时间 内存使用效率(堆使用效率)在这里不做过多介绍。 1. 总览垃圾回收算法的整体迭代历史如下: 标记-清除算法(Mark Sweep GC):于1960年发布; 复制算法(Copying GC):于1963年发布; 标记-整理算法(Mark Compact GC) 分代GC(Generational GC) 2. 标记-清除算法(Mark Sweep GC)标记-清除算法核心分为两个阶段: 标记阶段:将所有存活的对象进行标记; 清除阶段:从内存中删除没有标记的对象,即非存活对象。 优点很明显,实现简单。整体逻辑就是标记存活对象,然后删除非存活对象即可。 缺点 碎片化问题严重:由于内存是连续的,在对象被删除后,内存中会出现很多内存碎片,如果需要分配一个较大的对象的话,可能会出现,剩余总量够,但依然无内存可分配的情况; 分配速度太慢:其实也是碎片化的问题造成的。由于内存碎片的存在,要想分配空间,就必须维护一个表用于记录空闲内存。有一定可能需要遍历整个表才能获得合适的内存空间。 ...
设计模式——模版方法
模板方法(Template Method)是一个比较简单的模式。它的主要思想是,定义一个操作的一系列步骤,对于某些暂时确定不下来的步骤,就留给子类去实现好了,这样不同的子类就可以定义出不同的步骤。 本文将从以下几点对模版方法设计模式进行讨论: 模版方法的特点 模版方法的使用场景 模版方法的实现 模版方法的应用 1. 模版方法的特点 把子类中不变的逻辑抽离到父类(模版类)中,去除了子类中的重复代码,易于阅读和维护; 模版类中的具体实现细节留给子类实现,有助于功能的扩展和维护; 模版类的扩展和修改交给子类,符合开闭原则。 2. 使用场景 当多个子类具有公用的方法,却执行流程逻辑相同时。可以把核心的算法和重要的功能设计为模板方法,子类去实现相关细节功能; 重要的、复杂的方法,且可能有不同的实现,可以考虑作为模板方法。 举个例子🌰: 现在有一个查询的业务,具体的流程很简单,就是调用方法从数据库查询数据。但是可能使用MySQL,也可能使用Oracle或者Postgre SQL等,也可能在查询数据库之前先走一遍缓存等。但是整体流程的动作都是查询数据库,然后拿到数据对其数据做相应...