- 博客(30)
- 资源 (6)
- 收藏
- 关注

原创 深入理解Java volatile关键字
以下内容均摘自 《Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide, Part 1》2.8.5 Controlling the Processor…The LOCK prefix invokes a locked (atomic) read-modify-write operation when modifying a memory operand. T
2020-07-25 14:26:02
1905
2
原创 vscode+docker搭建linux c开发环境
步骤如下:第1步、构建自定义的docker镜像。Dockerfile如下:FROM ubuntu:18.04# 替换为阿里云镜像,如不需要可以去掉本部分RUN printf '\n\deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse \n\deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted uni
2022-05-15 14:49:00
1527
原创 draw.io使用技巧
本文的使用技巧总结自 draw.io 官方的 YouTube频道 以及 交互式教程。一、常用快捷键以下为mac系统的快捷键,windows系统需要将option替换为altresize时:按住ctrl 或 ctrl + shift 可以保持图形中心不变option + shift + 箭头:在当前图形的上/下/左/右快速创建图形复制形状:按住cmd鼠标拖动形状替换形状:选中形状 —> 按住shift —> 左侧点选目标形状二、高级特性1、插入 —> 布局只需点
2022-05-11 21:10:47
11921
原创 docker-compose搭建kafka集群
version: '2'services: zoo1: image: bitnami/zookeeper:3.7 container_name: zoo1 restart: always hostname: zoo1 ports: - "2181:2181" volumes: - ./zoo1/data:/bitnami/zookeeper - ./zoo1/log:/opt/bitnami/zookeeper/lo
2022-03-10 20:19:48
3360
原创 Mac Docker Failed to ping backend API 错误解决
解决步骤如下:Command + 空格,搜“活动监视器”打开,在活动监视器中搜索docker相关进程强制关闭cd ~/Library/Group\ Containers/group.com.dockerrm -rf settings.json重新打开docker,根据相关提示进行操作即可成功运行参考:Docker - Failed to ping backend...
2021-08-22 13:43:39
1136
1
原创 分布式系统中的一致性模型
下面的图展示了各种一致性之间的关系:分布式数据存储分布式数据存储 Distributed Data-Store [1]数据存储 (data store) 是对可以存储数据的服务的抽象。这里的数据存储可以是:共享内存 (shared-memory)、数据库、文件系统、对象和Web服务器等等。数据存储存储的是一个个的数据项 (data items)。对于不同的数据存储,数据项可以有不同的含义,例如内存的一个页面、数据库的一条记录、文件系统的一个文件、对象的一个变量和一个网页等等。客户端 (cli
2021-07-02 21:32:47
1831
原创 Spring @PropertySource用法和源码分析
用法https://mkyong.com/spring/spring-propertysources-example/[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nh5bKk0V-1620551204402)(C:\Users\Lv Hao\AppData\Roaming\Typora\typora-user-images\image-20210509144724369.png)]核心类Properties[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下
2021-05-09 17:06:55
644
原创 Class和ClassLoader的getResource方法详解与源码分析
classpathJava中有两个classpath,一个是bootrap classpath,另一个是classpath。classpath有如下两种形式 [4]:JAR files(JAR文件的全路径),andPaths to the top of package hierarchies.(顶级目录路径)bootrap classpathboot class path对应于启动类加载器,根据类加载的双亲委派模型,Java程序运行时首先会由启动类加载器加载boot class path下的
2021-03-09 23:02:47
3709
原创 InnoDB的行格式
MySQL中,由存储引擎负责数据的存储和读取,数据在不同存储引擎中的存储格式一般是不同的。下面将主要讲述InnoDB中数据的存储结构。InnoDB的页InnoDB按页组织数据,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为16KB。InnoDB的行格式行格式,也叫记录格式。InnoDB中支持4种行格式:CompactRedundantDynamicCompressed可以通过如下命令指定或修改行格式:create table 表名 (列信息) row_format
2020-09-10 22:57:58
512
原创 MySQL explain命令总结
explain有什么用(执行计划)https://dev.mysql.com/doc/refman/8.0/en/explain-output.htmlexplain命令支持SELECT, DELETE, INSERT, REPLACE, UPDATE语句,它可以输出SQL语句的执行计划,通过执行计划我们可以了解MySQL是如何执行给定的SQL语句的。具体来说,explain的输出包含如下信息:对于SELECT语句中使用到的每张表,输出一行对应的信息表信息的顺序就是MySQL处理该语句时读取
2020-09-05 14:15:09
298
原创 ReentrantReadWriteLock源码分析
一、ReentrantReadWriteLock官方文档https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.htmlpublic class ReentrantReadWriteLock implements ReadWriteLock, java.io.Serializable1. 锁的获取顺序对于获取获取锁的顺序,该类并没有特殊的偏向读者或写者
2020-08-21 13:53:59
223
原创 AQS框架-谈谈对AQS框架的理解
AQS是一个框架,基于它我们可以实现锁和同步器,J.U.C.包中和很多锁和同步器都是基于AQS实现的。使用AQS的方式通常不是让锁或同步器直接继承AQS类,而是将AQS的子类作为锁或同步器类的一个辅助内部类,锁或同步器的方法调用AQS子类对象的方法完成同步操作。(图片来自网络)state字段AQS中最重要的一个字段就是同步状态字段state,锁和同步器的实现都是围绕着这个字段的修改展开的,AQS中也暴露出了一些方法供我们重写以操作这个字段,例如tryAcquire, tryRelease, try
2020-08-19 20:30:11
3085
原创 Thread.sleep, Object.wait 和 LockSupport.park 的区别
Thread.sleep, Object.wait 和 LockSupport.park 的对比
2020-08-15 14:53:36
299
原创 Spring之循环依赖
所谓循环依赖,顾名思义,就是类 A 依赖类 B,类B同时也依赖类A。Spring解决了基于setter注入和基于field注入的单例bean的循环依赖问题,没有解决基于构造器的注入以及原型作用域的bean的循环依赖问题。一、三级缓存三级缓存对循环依赖的解决至关重要,Spring中的三级缓存在DefaultSingletonBeanRegistry中定义:/** Cache of singleton objects: bean name to bean instance. * 一级缓存: 存放完整的b
2020-08-10 19:25:18
299
原创 Java final关键字在JMM中的含义
参考:[1] JSR 133 (Java Memory Model) FAQ[2] The JSR-133 Cookbook for Compiler Writers一、properly constructed / this对象逸出在开始讲之前final之前,先了解一个概念,叫做 “properly constructed”。其含义是:在构造器创建对象的过程中,正在被创建的对象的引用没有发生 “逸出(escape)” 。public Test { private final int
2020-07-29 21:02:23
713
2
原创 内存一致性模型笔记 (Memory Consistency Model)
参考文档:[1] Multiprocessors should support simple memory consistency models[2] Shared MemoryConsistency Models:A Tutorial一、什么是内存模型?内存模型 (memory model),也叫内存一致性模型 (memory consistency model),它可以简单的理解为一系列对内存读写操作的规定,包括针对内存读写操作的重排序规则、可见性规则(一次读操作能否看到最近一次写入的结果?
2020-07-27 21:28:29
4181
2
原创 UNIX环境高级编程之一:IO
fopen FILE *fopen(const char *pathname, const char *mode);第二个参数mode:在遵守POSIX规范的系统中,b模式修饰符会被忽略。如果要考虑兼容C89或者程序移植性,可以加上b只看开头的模式,传入rw相当于r,传入r+w相当于r+r和r+模式要求文件必须已经存在void *指针可以赋值给任意类型的指针类型,无须显示进行类型转换。Q:fopen返回的文件指针指向的内容位于内存中的哪个区域?fopen返回一个FILE指针,FIL..
2020-07-22 12:08:33
857
原创 JNI之一:什么是JNI (Java Native Interface)
JNI,即Java本地接口 (Java Native Interface),它是连接Java代码和本地代码之间的桥梁,其中,本地代码可以是C,C++,Fortran等语言编写的。JNI允许我们在Java代码中调用本地代码,也允许本地代码调用Java代码。我们都知道,在Java中存在本地方法(native method),这种方法用native关键字进行修饰。本地方法底层是用C/C++语言实现的。调用本地方法和调用普通的Java方法的语法一样。Java代码会被编译成平台无关的字节码,而用C/C++编写的.
2020-07-11 19:41:51
1547
原创 x86_64汇编之六:系统调用(system call)
本文将主要讲述如何在汇编语言代码中调用Linux的系统调用。一、32位系统的系统调用在32位x86 Linux系统中,可用的系统调用定义在/usr/include/asm/unistd_32.h头文件中。每个系统调用都对应一个编号 以及 若干个参数。如果想使用汇编语言调用系统调用,那么在调用之前,需要将系统调用编号存到%eax,将参数依次存到%ebx, %ecx, %edx, %esi, %edi, %ebp中,然后再执行int $0x80指令即可。每个系统调用的编号和参数列表可以参考:https:
2020-07-10 15:39:40
7250
原创 x86_64汇编之一:AT&T汇编语法
汇编语法主要有两大派系:AT&T语法 和 Intel语法。GAS (GNU Assembler) 编译器默认是基于AT&T语法;MASM、NASM等编译器默认基于Intel语法。需要说明的是,GAS汇编器除了支持AT&T语法之外,自己也定义了一些额外的directives,用于辅助完成汇编操作。关于GAS汇编器及其语法可以参考GAS的官方文档:https://sourceware.org/binutils/docs/as/由于AT&T语法在Linux平台上使用比较广泛,
2020-07-10 09:33:17
9504
1
原创 x86_64汇编之五:System V AMD64调用约定下的函数调用
之前提到了,System V AMD64调用约定是x86_64 Linux系统上使用最广泛的调用约定,gcc/g++等编译器都默认使用该调用约定。凡是遵循System V AMD64调用约定的汇编代码,都有一定的固定模式,比如函数开头做哪些处理,函数末尾做哪些处理等等。遵循该约定的函数一般是如下的模式。Caller的操作在调用callee之前,通常有以下操作:步骤1:设置参数到寄存器/栈中 mov xxx, %rdi # 第一个参数 mov xxx, %rsi # 第二个参数 mov xxx,
2020-07-09 19:33:21
2600
原创 x86_64汇编之四:函数调用、调用约定
一、栈栈一般从高地址往低地址生长,每个函数都在栈空间中对应一个栈帧。关于栈帧有两个重要的指针——栈基址指针BP和栈顶指针SP。其中,除了在函数的开头和结尾(后面会讲到),BP指针一般是固定不变的,通常以它为基准来寻址参数和局部变量,例如将第一个参数放入栈中的汇编代码可以是movq %rdi, -8(%rbp)。和栈相关的两个指令是push和pop。在x86_64架构的计算机上,push operand指令的作用是:将栈顶指针rsp减去8(即8字节)然后将目标操作数放入更新后的rsp所指向的地址
2020-07-09 18:26:09
11881
原创 x86_64汇编之二:x86_64的基本架构(寄存器、寻址模式、指令集概览)
一、x86_64中的寄存器x86_64架构中的寄存器可分为以下几类:通用寄存器 (General-Purpose registers)状态和控制寄存器(RFLAGS register)指令寄存器 (RIP)XMM、YMM、ZMM寄存器浮点控制和状态寄存器 (MXCSR)如下图所示:通用寄存器通用寄存器主要用于完成一些通用的功能,包括算数运算、逻辑运算、比较运算、数据转移、地址计算,还可以临时存放常量、中间结果、指针等内容。x86_64中的通用寄存器如下:x86_64中的一个通用
2020-07-08 13:28:16
12682
1
原创 x86_64汇编之三:x86_64汇编和x86_32汇编的区别
顾名思义,x86_64汇编是64位机器上使用的汇编,而x86_32汇编是32位机器上使用的汇编。1. 地址、操作数、寄存器使用上的区别x86_32汇编中的大部分指令在x86_64中都有对应,功能相同,只不过x86_64上的对应指令可能支持操作64位的地址、操作数和寄存器。需要注意的是,x86_64中操作的地址不一定非得是64位,也可以是32位的。例如,x86_64支持下面的指令:mov r10, [eax]其中,eax的内容就是地址,这个32位的地址前面会被补上32位的0,也就是说,eax 只能
2020-07-08 10:59:40
3388
原创 C语言目标文件概述 (Object File)
C程序的编译过程结束后,会为每个c文件生成一个对应的目标文件。目标文件由一系列的section组成,最常见的section包括:.text:存放代码.data:存放初始化过的数据.bss:存放未初始化的数据其他一些更特殊的section,例如存放调试信息的section等等在链接过程,会将各个目标文件的.text都拼在一起,.data都拼在一起,.bss都拼在一起… 最终生成一个可执行文件,该可执行文件也包含.text, .data, .bss等section。目标文件中每个sect
2020-07-07 16:07:41
2881
原创 Makefile教程 (一) —— 如何编写一个简单的Makefile
在详细介绍Makefile之前,我们先来看一下一个Makefile文件长啥样,对它有一个直观的认识。下面是一个Makefile的例子,摘自 https://makefiletutorial.com/:blah: blah.o gcc blah.o -o blahblah.o: blah.c gcc -c blah.c -o blah.oblah.c: echo "int main() { return 0; }" > blah.cclean: rm -f blah.o blah.
2020-07-06 22:37:40
1223
原创 SC-DRF
本文参考了Sarita V. Adve和Mark D. Hill的Weak Ordering - A New Definition And Some Implications一、顺序一致性(Sequential Consistency, SC)顺序一致性最早是由Lamport定义的,其定义如下:“… the result of any execution is the same as ...
2020-02-07 23:26:05
820
原创 偏序关系和全序关系
一、关系 (relation)https://www.youtube.com/watch?v=FI6j5QZNVx0&list=PLDDGPdw7e6Ag1EIznZ-m-qXu4XX3A0cIz&index=48https://web.stanford.edu/class/archive/cs/cs103/cs103.1132/lectures/06/Slides06.pd...
2020-02-06 18:29:01
7866
1
原创 SOLID设计原则之里氏替换原则
1. 引入SOLID设计原则的之中的开闭原则(Open/Closed Principle, OCP)主要是基于抽象和多态实现的。而实现抽象和多态的关键机制之一就是继承。如何设计继承体系才能使得抽象和多态正常的发挥作用,并且不违背开闭原则呢? 这是里氏替换原则(Liskov Substitution Principle, LSP)要解决的问题。2. 定义里氏替换原则的定义如下:Funct...
2019-05-02 16:44:50
450
Spring 5.2.4版本官方文档英文pdf(Spring Core + Spring MVC + ...)
2020-03-09
python机器学习 中文版 Sebastian Raschka
2018-02-04
Dafydd Stuttard
2015-07-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人