Posts

Git 删除子模块/远程分支

删除子模块 # 逆初始化模块,其中{MOD_NAME}为模块目录,执行后可发现模块目录被清空 git submodule deinit {MOD_NAME} # 删除.gitmodules中记录的模块信息(--cached选项清除.git/modules中的缓存) git rm --cached {MOD_NAME} # 提交更改到代码库,可观察到'.gitmodules'内容发生变更 git commit -am "Remove a submodule." 修改某模块URL 修改’.gitmodules’文件中对应模块的”url“属性; 使用git submodule sync命令,将新的URL更新到文件.git/config; $ git submodule sync # 运行后可观察到'.

Nov 3, 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

IO多路复用(IO Multiplexing)

I/O多路复用(I/O Multiplexing)是一种并发处理的机制,它允许单个进程或线程处理多个I/O操作,而不需要创建额外的线程或进程。

Nov 2, 2020

MySQL授权

创建数据库 create database <database> default character set utf8mb4 collate utf8mb4_unicode_ci; 参数说明: <database>: 数据库名称 用户管理 添加用户 create user '<username>'@'<host>' identified by '<password>' 例子: create user 'xiaoming'@'localhost' identified by '123'; create user 'xiaoming'@'192.

Nov 2, 2020

初始化项目目录 npm init -y pnpm i -D typescript ts-node ts-node-dev @types/node npm install typescript -g tsc init “scripts”: { “build”: “tsc”, “dev”: “ts-node-dev –respawn ./src/index.ts”, “start”: “ts-node ./src/index.ts” },

Jan 1, 0001

源码中有软连接,go get的时候会丢失软连接 丢失更新:两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,这是由于没有加锁造成的; 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 e.g. 1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务) 2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地! 3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000 像这样,Mary记取的工资数8000是一个脏数据。 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。 e.g. 1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成 2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务. 3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000 解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。 e.g. 目前工资为1000的员工有10人。 1.事务1,读取所有工资为1000的员工。 2.这时事务2向employee表插入了一条员工记录,工资也为1000 3.事务1再次读取所有工资为1000的员工 共读取到了11条记录, 解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题

Jan 1, 0001