Hugo

📈 Communicate your results effectively with the best data visualizations
📈 Communicate your results effectively with the best data visualizations

Use popular tools such as Plotly, Mermaid, and data frames.

Oct 25, 2023

👩🏼‍🏫 Teach academic courses
👩🏼‍🏫 Teach academic courses

Embed videos, podcasts, code, LaTeX math, and even test students!

Oct 24, 2023

通过Github自动部署Hugo

以前通过hexo 和 dukewiki 做过个人学习笔记和Blog,但是部署在树莓派上。因为该死的switch,对,就是玩游戏的那个。当时switch有SD不够用,就把树莓派上的SD卡拿来格式化了(忘记wiki部署在上面),结果所有的笔记全部没有了。这是一个悲惨的教训,所以有了接下来的事情,废话不多说了,直接开始。

Nov 2, 2020

Volatile 关键词

volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。 正常情况下: 有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈。 当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程私有内存中(线程栈),建立一个变量副本 之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值。 在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。 volatile变量改变后写回主内存时,会让所有线程的工程内存中该变量副本置为无效,那么其他线程再次读取变量副本时由于副本时无效的会从主内存中重新读取,从而达到读取到最新值的效果 volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。 值得说明的是对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证i++这种操作的原子性,因为本质上i++是读、写两次操作。 public class VolatileTest extends Thread { boolean flag = false; int i = 0; public void run() { while (!flag) { i++; } } public static void main(String[] args) throws Exception { VolatileTest vt = new VolatileTest(); vt.

Nov 2, 2020

NIO

在讲NIO的原理之前,首先掌握几个基础概念,内核缓冲进程缓冲区 进程缓冲区:存在于用户程序空间,由应用程序进行管理。 内核缓冲区:存在于内核空间,由操作系统的内核进行管理,当我们进行IO操作的时候,无论是硬盘还是网络,内核缓冲去的数据什么时候写入到磁盘,什么时候写入到网卡,是由内核来决定,应用程序不需要感知。 四种主要的IO模型 什么是阻塞和非阻塞? 阻塞和非阻塞是针对于进程在访问数据时,根据IO操作的就绪状态而采取的不同方式,简单来说是一种读取或写入操作函数的实现方式,阻塞方式下读取或写入函数将一直等待。非阻塞方式下,读取和写入函数会立即返回一个状态值。 什么是同步和异步? 同步和异步是针对应用程序和内核的交互而言的,同步是指用户进程触发IO操作并等待或轮询的查看IO操作是否就绪,异步是指用户进程触发IO操作以后便开始做自己的事情,当IO操作完成时会得到通知,换句话说异步的特点就是通知。 IO模型可以分为四种:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞 同步阻塞IO(Blocking IO) 阻塞IO,指的是需要内核IO操作彻底完成后,才返回到用户空间,执行用户的操作。阻塞指的是用户空间程序的执行状态,用户空间程序需等到IO操作彻底完成。传统的IO模型都是同步阻塞IO,其中同步是指用户应用程序主动向内核发起IO请求。 同步非阻塞IO(Non-blocking IO) 非阻塞IO,指的是用户程序不需要等待内核IO操作完成后,内核立即返回给用户一个状态值,用户空间无需等到内核的IO操作彻底完成,可以立即返回用户空间,执行用户的操作,处于非阻塞的状态。 异步阻塞(Asynchronous Blocking IO) 异步IO,指的是用户空间与内核空间的调用方式反过来。用户空间线程是变成被动接受的,内核空间是主动调用者。 同步阻塞IO是指用户进程在发起一个IO操作后必须等待IO操作完成,只有当真正完成了IO操作后用户进程才能运行。 同步非阻塞IO是指用户进程发起一个IO操作后立即返回,程序也就可以做其他事情。但是用户进程需要不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。 NIO NIO是同步非阻塞IO 同步是进行IO操作的时候是由应用程序主动发起向内核发起IO请求。 非阻塞表示IO操作不会阻塞当前进程的执行。 如果和避免NIO中的论 NIO采用了IO多路复用技术,因为NIO是同步IO,所以采用的是多路复用中的Reactor模式。 NIO的select实际上是使用的epoll来实现的,EPollSelectorImpl extend SelectorImpl。

Nov 2, 2020