CountDownLatch详解
之前我们通过讨论ReentrantLock学习到了AQS的核心、公平与非公平锁的实现以及Condition的实现原理。但是之前所涉及到的都是非共享锁,也就是独占锁。今天我们来讨论基于AQS的共享模式实现的CountDownLatch组件。本文大体上会分为两部分进行讨论。第一部分为介绍CountDownLatch的使用,第二部分将通过源码来分析CountDownLatch的实现原理。 1. CountDownLatch的使用CountDownLatch是一个使用频率非常高的类, 是AQS共享模式的典型应用。它的名字翻译过来为:倒计时门闩。具体的使用如下所示: 123456789101112131415161718192021222324252627282930313233class Driver2 { // ... void main() throws InterruptedException { CountDownLatch doneSignal = new CountDownLatch(N); Executor e = ...
CyclicBarrier详解
之前的文章中讨论过了[[CountDownLatch详解| CountDownLatch]]的使用方法和原理。今天再来讨论一下CyclicBarrier,CyclicBarrier的使用场景其实和CountDownLatch非常相似,用法也非常像,唯一地区别就是,不像CountDownLatch那样用一次就没了,CyclicBarrier可以重复使用。就像它名字的含义:“可以重复使用的栅栏”。今天将依然分别从它的使用和原理进行讨论。 1. CyclicBarrier的使用首先看看JavaDoc中给出的例子: 12345678910111213141516171819202122232425262728293031323334353637383940414243class Solver { final int N; final float[][] data; final CyclicBarrier barrier; class Worker implements Runnable { int myRow; Worker(int ...
Endtoend Encrypted Traffic Classification with One dimensional Convolution Neural Networks
此篇方法是第一个将端到端的方法应用到加密流量分类领域,使用数据集ISCX-VPN-NonVPN-2016数据集进行研究。 1、概念介绍1.1 流量加密技术依据ISO/OSI层的不同,加密技术可以分为 应用层加密:应用程序在应用层实现自己的协议以实现数据的安全传输(如BitTorrent或Skype),在一些论文中也称为常规加密。 表示层加密 网络层加密:如IPSec加密协议 1.2 常见加密协议 IPSec协议:网络层加密协议。分为传输与隧道两种模式 传输模式:在IP报头和高层协议报头中插入一个IPSec报头,该模式不会改变IP报头中的目的地址,源IP地址也保持明文状态。 隧道模式:报文的源IP地址以及数据被封装成一个新的IP报文,并在内部和外部报头之间插入一个IPSec报头,原来的IP地址作为需要进行安全业务处理的一部分来提供安全保护,并且该模式下,可以对整个IP报文进行加密操作,常用来实现虚拟专用网VPN。 SSL/TLS协议:传输层协议。对于TLS,简单地说,是在TCP层之上再封装了SSL层。安全套接层协议 SSL 提供应用层和传输层之间的数...
JVM中常见的垃圾回收算法
了解垃圾回收算法前,需要先了解评价垃圾回收算法的评价标准和指标。有以下几点: 吞吐量 最大暂停时间 内存使用效率(堆使用效率)在这里不做过多介绍。 1. 总览垃圾回收算法的整体迭代历史如下: 标记-清除算法(Mark Sweep GC):于1960年发布; 复制算法(Copying GC):于1963年发布; 标记-整理算法(Mark Compact GC) 分代GC(Generational GC) 2. 标记-清除算法(Mark Sweep GC)标记-清除算法核心分为两个阶段: 标记阶段:将所有存活的对象进行标记; 清除阶段:从内存中删除没有标记的对象,即非存活对象。 优点很明显,实现简单。整体逻辑就是标记存活对象,然后删除非存活对象即可。 缺点 碎片化问题严重:由于内存是连续的,在对象被删除后,内存中会出现很多内存碎片,如果需要分配一个较大的对象的话,可能会出现,剩余总量够,但依然无内存可分配的情况; 分配速度太慢:其实也是碎片化的问题造成的。由于内存碎片的存在,要想分配空间,就必须维护一个表用于记录空闲内存。有一定可能需要遍历整个表才能获得合适的内存空间。 ...
Java内存模型(JMM)
本文要讨论的是Java内存模型(JMM)。它的名字和JVM内存结构(见[[运行时内存详解]])很像,但是他们两个并不在一个层面,解决的问题也不一样。 Java 内存模型定义了 Java 语言如何与内存进行交互,具体地说是 Java 语言运行时的变量,如何与我们的硬件内存进行交互的。 而 JVM 内存模型,指的是 JVM 内存是如何划分的。 JMM是并发编程的基础,只有对JMM有一定了解才能更好的理解Java的一些高级特性,如:volatile等。因此本文将从以下几点进行讨论: 为什么要有Java内存模型? Java内存模型是什么? 并发编程的三个重要特性 1. 为什么要有Java内存模型?Java是从JDK1.5之后才开始使用新的Java内存模型。一般来说,编程语言是可以直接使用操作系统的内存模型的。但是由于Java是一个跨平台的语言,要求JVM层面屏蔽掉不同操作系统和不同硬件的差异。因此自定义了一套Java内存模型。 Java虚拟机规范中定义的Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java...
Git常用命令
tags: 开发工具/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 merg...
JVM介绍及结构
1. 什么是JVM?JVM指的是Java虚拟机,本质上是一个运行在计算机上的程序,负责运行Java字节码文件。充当一个适配器的角色,以实现Java跨平台的特性。 1.1 JVM的功能 解释执行字节码指令 管理内存中对象的分配,完成自动的垃圾回收 优化热点代码以提升效率(JIT) 1.2 JVM的组成总体分为,类加载子系统、运行时数据区、执行引擎、本地方法接口四部分。如图: 2. 运行时数据区组成运行时数据区指的是JVM所管理的内存区域。按照是否线程共享分类,分为两类: 线程共享: 方法区、堆 线程不共享: 本地方法栈、虚拟机栈、程序计数器 如下图所示: 2.1 程序计数器(Program Counter Register)也叫PC寄存器,每个线程通过PC来记录当前要执行的字节码地址。主要作用有两个: 用于控制程序指令的进行,实现分支、跳转、异常等逻辑; 多线程下,JVM通过PC记录线程切换钱执行到哪一句指令,并继续解释执行。 2.2 虚拟机栈数据结构如其名,采用栈结构来管理方法调用中的基本数据,每个方法调用采用一个栈帧来保存。每个线程都会包含自己的虚拟机栈。因此,生...
Java的对象头结构
对象除了我们自定义的一些属性外,在HotSpot虚拟机中,对象在内存中还可以分为三个区域:对象头、实例数据、对齐填充,这三个区域组成起来才是一个完整的对象。本文将对于对象头部分的结构进行讨论。 1. 对象的内存布局对象在内存中可以分为三个区域,分别为对象头、实例数据、对齐填充。 对象头: 为本文的讨论重点,下文将会讨论; 实例数据: 存放类的属性数据信息,包括父类的属性信息; 对齐填充: 由于虚拟机要求 对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。 2. 对象头对象头中存储了对象是很多java内部的信息,如hash码、对象所属的年代、对象锁、锁状态标志、偏向锁(线程)ID、偏向时间等,Java对象头一般占有2个机器码。 在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中,1个机器码是8个字节,也就是64bit 其中,如果对象是数组类型,则需要三个机器码。因为JVM虚拟机可以通过Java对象的元数据信息确定Java对象的大小,但是无法从数组的元数据来确认数组的大小,所以用一块区域用来记录数组长度。 HotSp...
Java相关笔记
JVM相关[[JVM介绍及结构]] [[常见的垃圾回收器]] [[JVM中的引用]] [[关于双亲委派]] [[JVM中常见的垃圾回收算法]] [[运行时内存详解]] [[Java的对象头结构]] [[Java内存模型(JMM)]] [[类的生命周期及类加载器]] [[Java对象的创建过程]] 多线程相关[[线程的状态]] [[认识AQS]] [[关于Synchronized的一些讨论]] [[开启线程有几种方法?]] [[讨论几个Thread的常用API]] [[ReentrantLock详解(一)—— 加锁和解锁]] [[ReentrantLock详解(二)]] [[ReentrantReadWriteLock详解]] [[Semaphore详解]] [[CountDownLatch详解]] [[CyclicBarrier详解]] [[ThreadLocal详解]] MySQL[[扫盲——脏读、不可重复读、幻读]] [[InnoDB中MVCC的实现原理]] [[InnoDB中的Change Buffer是个啥?]] 设计模式[[设计模式——模版方法]] Netty [[NI...
Learning to Classify A Flow Based Relation Network for Encrypted Traffic Classification
加密流量分类的挑战性问题: 网络数据的不平衡性 模型对真实数据的泛化能力 模型对数据大小的过度依赖。 1、概念介绍1.1 流量加密背景加密技术虽然保护了互联网用户的自由、隐私和匿名性,但也用户避开了防火墙的检测,绕过了监控系统。 由此导致的问题: 攻击者通过加密恶意软件流量来匿名入侵和攻击系统。 犯罪分子使用隐私增强工具(例如Tor)穿透黑暗网络,在那里他们可以购买毒品、武器和伪造的文件(如护照、驾照、提供合同杀手的媒体)来吸引客户. 1.2 流量分类技术的发展(综述部分) 基于端口号 基于有效载荷,也就是DPI方法。1,2只能针对非加密流量 基于流统计特征的方法,分类性能取决于人类的特征工程 基于深度学习的方法: 优点:端到端、具有相当高的学习能力 缺点: 不能解决数据中类的不均衡问题 训练好的模型不能很好适用于真是流量环境,泛化能力差 过分依赖数据集的大小与数据分布的好坏 1.4 文章核心观点引入对于一个新奇概念的样本,人类可以轻易根据对事物共同变化模式的了解,想象该样本在其他环境的样子。如果机器从辨别出在不同环境(原文这里称作幻觉(hallucinat...