Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
计算机网络 自顶向下方法(应用层)
WireShark 抓包指南: https://zhuanlan.zhihu.com/p/82498482
协议分层协议规定了发送者、接收者和所有中间设备为了高效通信需要遵守的规则。
协议分层允许我们将一个复杂的任务分解成几个较小的、简单的任务。
协议分层的好处:
第一,它允许我们将服务从实现中分离出来。一层需要能够接收较低一层的一系列服务,同时向较高层提供服务,而我们不需要关心这一层是如何实现的。
第二,在通信过程中中间系统只需要一些层次而不是所有的层次,如果不使用协议分层,形成的中间系统就不得不像端系统一样复杂,这样会提高整个系统的造价。
TCP/IP 各层描述应用层应用层通信处于两个进程之间,是端到端的一种通信方式。常见的涉及到的协议包括: 超文本传输协议(HTTP,是访问万维网的载体);简单邮件传输协议(SMTP,是电子邮件服务的主要协议);文件传输协议(FTP);远程登陆(TELNET);安全外壳(SSH,用于访问远端的站点);简单的网络管理协议(SNMP);域名系统(DNS);因特网组管理协议(IGMP,用于管理一个组的成员资格);
传输层传输层 ...
深入理解Java虚拟机—垃圾收集器与内存分配策略
在Java的运行时数据区的各个部分,其中程序计数器、虚拟机栈、本地方法栈都为线程私有,随着线程生灭。因此垃圾收集器的主要作用区域是线程共享的堆和方法区。
确定哪些对象需要被回收?引用计数算法算法思路:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加一;当引用失效时,计数器的值就减一;任何时刻计数器为零的对象就是不会再被使用的。
引用计数法执行起来很简单,效率也比较高,但是有一个很难解决的问题就是循环引用。什么是循环引用?
对象 objA和对象objB都由字段 instance,赋值令 objA.instance = objB.instance,除次之外,这两个对象再无其它引用,此时就会产生循环引用的问题。
但是测试过程中发现虽然代码中存在循环引用的问题,最终还是进行了垃圾回收,也就是说Java虚拟机并不是通过引用计数算法来判断对象是否是存活的。
可达性分析法算法思路:通过一系列被称为 “GC Roots”的根对象作为起始结点集,从这些结点开始,根据引用关系向下搜索,搜索过程所走过的路径称为 “引用链”,如果某个对象到GC Roots间没有任何引用链相 ...
深入理解Java虚拟机—Java内存区域
Java虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域。这些区域各有各自的用途,以及创建和销毁的时间。总的来说Java虚拟机可以划分为如下几个运行时数据区部分。
首先总体上说Java虚拟机包括方法区、堆、虚拟机栈、本地方法栈、程序计数器五个主要的运行时数据区部分。
程序计数器介绍:程序计数器(PC) 用来指示当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改变这个计数器的值来指明下一条需要执行的字节码指令。它是程序控制流的指示器、,分支、跳转、循环、异常处理、线程恢复等基础功能都依赖于这个计数器来完成。
特性:为了多个线程之间的执行操作互不影响,每个线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为 “线程私有” 的内存。
如果线程执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是一个本地(Native)方法,则计数器的值应该为空。
程序计数器是各个运行时数据区中唯一一个不会出现OutOfMemoryError情况的区域。
Java虚拟机栈介绍:Java虚 ...
TCP三握四挥知识拓展
TCP与UDP、三握四挥的拓展TCP 基本认识
1. TCP 头格式
参考:https://blog.csdn.net/zhouzhenhe2008/article/details/71075969
https://www.cnblogs.com/azraelly/archive/2012/12/25/2832393.html
序列号:在初始建立连接时计算机随机分配一个值作为初始值,之后每发送一次数据就加上此次发送数据的字节数大小。用来解决包乱序问题。
确认号:表示下一次希望接收的数据的序号。发送方通过确认号来确定此序号之前的所有数据都被接收了,用来确认传输过程不丢包。
控制位:(URG、ACK、PSH、SYN、RST、FIN)
URG:为1表示有紧急数据需要发送,结合紧急指针一起使用;
ACK:初始建立连接时为0,之后整个数据传输过程都为1,表示确认号有效;
PSH:为1表示本次传送的数据不为空,真正的有数据需要传输;
SYN:为1表示请求建立连接;
RST:为1表示tcp连接时出现了问题,需要重新建立连接;
FIN:为1表示通信过程结束,请求释放连接。
窗口大小:指 ...
Office(一)、基础使用
一、对文档进行保存加密处理
在保存界面选择保存方式,然后输入文件打开时的密码。
在保存时可以通过工具 选项选择保存选项,里面可以设置修改文件的密码。
这样在打开文件的时候就会提示我输入文件阅读密码,输入后会再次提示输入文件修改密码,否则只会作为只读文件类型打开。
ConcurrentHashMap源码解读
引言由于 HashMap 在多线程情况下存在线程安全的问题,因此在多线程情况下不会去选择使用这种结构,相应的我们会有几种方案去解决:
采用线程安全的 HashTable
使用 Collections.synchorizedMap(Map) 来创建线程安全的Map集合;
使用 ConcurrentHashMap
但是由于效率和并发度的原因,往往会舍弃前两种选择第三种方式。
1.7 中的ConcurrentHashMap1. 数据结构
JDK7 中 ConcurrentHashMap 由 Segment数组+HashEntry结点组成,和 HashMap一样,都是数组+链表的结构。
123456789101112131415161718192021222324252627282930313233343536373839//默认的数组大小16static final int DEFAULT_INITIAL_CAPACITY = 16;//扩容因子0.75static final float DEFAULT_LOAD_FACTOR = 0.75f; //ConcurrentHashM ...
ReentrantLock源码解读
一、Java中的锁1. Java当中有哪些锁?公平锁、非公平锁、读写锁、共享锁、互斥锁、自旋锁、偏向锁、轻量级锁、重量级锁
2. ReentrantLock锁与 Sync锁的区别12345678910111213141516171819public class test{ //定义一个静态对象 static A a = new A(); //定义juc下的 ReentrantLock锁对象 static ReentrantLock reentrantlock = new ReentrantLock(); public static void lockTest(){ //使用 ReentrantLock reentrantLock.lock(); //xxxxxxx操作。 reentrantlock.unlock(); //使用 Synchorized synchorized(a){ //xxxxxxx操作。 } } ...
ArrayList、LinkedList、Vector源码解读
ArrayList、LinkedList、Vector 三者差异比较一、ArrayList、LinkedList、Vector的区别(1)底层结构ArrayList 的底层是基于动态数组来实现的,LinkedList 的底层是基于拥有头尾指针的双向链表来实现的。
(2)继承关系ArrayList 继承于 AbstractList 抽象类,实现了 Serializable、Cloneable、RandomAccess接口,这里 RandomAccess接口只是为了允许随机访问而不是提高随机访问的效率;
LinkedList 继承于 AbstractList 抽象类,实现了 Seriablizable、Cloneable 接口,不支持随机访问。因为它的随机访问效率很低,它的 get() 方法是通过折半法然后指针顺序移动来实现的。
1234567891011121314151617181920212223242526272829303132//LinkedList get() 方法 /** * Returns the element at the specified pos ...
Synchronized源码解读
Synchorized一、Synchorized 的基本使用Synchorized的作用:
原子性:对同步代码块的访问是互斥执行的。
可见性:保证共享变量的修改能够及时可见,其实就是Java内存模型中的 “对同一个变量 unlock之前会将工作内存中变量的值同步到主内存中;对同一个变量的 lock 之前,则会清空工作内存中此变量的值,然后将主内存中的变量值同步到工作内存中”。
有序性:一个 unlock() 操作一定先行发生于**[happen-before]**后面对同一个锁的 lock() 操作。
Synchorized的用法:
当 Synchorized 作用在实例方法时,监视器锁**[Monitor]**是对象实例;
当 Synchorized 作用在静态方法时,监控器锁就是对象的 class实例;因为 class数据存在于方法区中,所以相当于该类的一个全局锁;
当 Synchorized 作用在某一个对象实例时,监控器锁就是括起来的对象实例。
二、Synchorized 锁的是代码还是对象12345678910111213141516171819202122232 ...