- 博客(74)
- 问答 (2)
- 收藏
- 关注
原创 go 1.18新特性(泛性 模糊测试 WorkSpace)
工作区之后,对项目的依赖包的修改不再需要进行实时升级,只需要在本地进行修改,等到项目代码提交时,一并升级即可,使用时有点类似于go mod 的replace,但是提交时并不需要修改go mod文件。在开发个过程中,如果多个module同时开发,并且module之间存在相互依赖的关系,可能会出现频繁升级依赖包的问题。我们在定义类型集的时候,可以在具体类型前加上符号**~** ,表示该类型以及它的别名类型都是该类型集的。一个项目同时在本地开发两个模块,A和B,并且A依赖B,当B升级后,A如何升级自己依赖的包?
2023-09-15 21:18:19 421 1
原创 使用pivot_root 实现root文件系统的隔离
我们使用创建了一个与主机文件系统隔离的容器进程,但是此时容器内的目录挂载是继承了主机目录挂载的。我们首先要将root 文件系统挂载到一个新的目录中。通过mount无法实现rootfs的切换,因为我们无法使所有的进程停止使用当前rootfs。当我们使用umount卸载当前rootfs挂载后,进程已经无法正常提供mount操作支持我们挂载新的rootfs。pivot_root。
2023-08-01 12:13:03 1223
原创 ETCD实现分布式锁
基于etcd实现的分布式锁基本上使用到了etcd的全部性质,并且保证了分布式锁的互斥性,安全性和可用性。官方实现的分布式锁并不支持可重入性,但是要实现可重入性锁也很简单,对这个锁在封装一层,并增加一个计数器。参考资料极客时间- etcd实战课etcd分布式锁的实现原理。
2023-05-15 20:44:43 1861 1
原创 docker学习笔记
虚拟机是在物理资源层面实现的隔离,相对于虚拟机,Docker是你APP层面实现的隔离,并且省去了虚拟机操作系统(Guest OS)),从而节省了一部分的系统资源;Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。虚拟机与容器docker的区别,在于。
2023-04-20 23:44:15 553
原创 Go语言实现分布式缓存(二) —— 单机并发缓存
这篇文章会使用互斥锁:**Mutex** 来保证缓存并发读写时的安全性,然后在此基础上实现单机的缓存。
2022-11-14 00:44:23 453
原创 Go语言并发编程——原子操作
而互斥锁实现的操作,当前执行Goroutine是会被其它Goroutine抢占的,但是其它的Goroutine在未获取锁的情况并不能顺利执行,从而保证了并发的安全性。同样的,在未使用原子写时,可能写到一半的数据被读到,所以要保证并发的安全性,要同时保证读和写的原子性,或者使用互斥锁保证读和写之间互斥,写和写之间也互斥。在非原子读时,可能会造成:读到一半Goroutine被中断,当Goroutine再次被调度时,数据已被修改,那么最终读出来的就是一个奇怪的值。原子操作能够使用的场景很少,是有很大局限性的。
2022-09-30 16:27:29 2035
原创 Go语言高并发编程——互斥锁、条件变量
A成功抢到了互斥锁,但是当A在执行任务时发现不满足执行任务的资源条件,那么就可以让goroutineA加入条件变量的消息等待队列,并且将锁释放掉。这时B拿到了锁,通过B的执行改变了资源条件,B执行完之后会通知A,收到通知的A就会重新获取锁,执行任务代码。当多个goroutine同时遇到被同一个互斥锁保护的代码块,它们之间就会产生锁竞争,只有抢到锁的goroutine才能去执行代码。但是当二者同时使用时,在写锁被持有的时候不能获取读锁,同样的,在读锁被持有的时候不能获取写锁。读写锁是读 / 写互斥锁的简称。
2022-09-29 11:15:58 714
原创 Go语言并发编程——Channel
Channel是用来实现goroutine之间通信的数据类型,该类型是go自带的唯一一个处理高并发十分安全的一个类型。
2022-09-29 11:10:36 1099 1
原创 SpringMVC处理请求的流程
前端控制器,不需要工程师开发,由框架提供作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求:处理器映射器,不需要工程师开发,由框架提供作用:根据请求的url、method等信息查找Handler,即控制器方法Handler:处理器,需要工程师开发作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理:处理器适配器,不需要工程师开发,由框架提供作用:通过HandlerAdapter对处理器(控制器方法)进行执行。
2022-09-05 16:40:45 320 2
原创 浅谈Spring中的IOC和DI
谁控制谁?spring容器控制对象的创建和初始化以及生命周期。如何反转?原先依赖对象控制被依赖对象的创建,现在由spring容器控制被依赖对象的创建。谁依赖谁?spring容器管理的对象依赖xml配置文件中的属性。谁注入谁?xml配置的属性注入spring容器管理的对象当中。
2022-09-02 19:57:05 412
原创 秒杀系统高并发优化
通俗来讲,高并发是指在同一个时间点,有很多用户同时的访问同一 API 接口或者 url 地址。它经常会发生在有大活跃用户量,用户高聚集的业务场景中。在秒杀系统中,当秒杀开始时,就会产生大量的用户聚集,此时就会给后端服务器带来很大的压力。尤其是在出现热点商品时,大量用户同时对同一个商品进行秒杀操作,这样就会带来更大的网络延迟(后面会具体说明)。...
2022-09-01 15:20:28 1031 1
原创 jQuery使用的简单总结
expires表示cookie存活日期,以天为单位,path表式允许访问该cookie的顶级路径,也就是说只有path以及path的子路径可以访问该cookie。jQuery为我们提供了操作cookie的插件,我们可以下载插件,也可以使用CDN,这里不做说明。domain:允许访问的域名,默认值为创建 cookie 的网页所拥有的域名。上面例子中的function为回调方法,表示当事件完成后执行的方法。:当请求成功时运行的函数,其中result为请求方法执行后的返回值。:预期的服务器响应的数据类型。...
2022-08-30 15:36:34 145
原创 ArrayList源码分析
.ArrayList实现了三个接口,这三个接口都是标志性接口(接口中没有任何方法)。表示可以随机访问,Collections工具类中许多通用的算法,它们就会通过判断是否实现了该接口来选择不同的实现方式。表示可克隆的,只有实现了该接口才可以调用Object类中的clone()方法,ArrayList对clone方法进行了重写,但是它仍然需要调用Object中的方法clone()。:表示可序列化的,只有实现了该接口的类,它的对象才能被序列化(通过ObjectOutputStream将对象写入文件)...
2022-08-04 16:20:29 244 1
原创 Java设计模式之装饰器模式
一般情况下想要扩展一个类的功能需要使用继承来实现,比如说HashSet有保证元素不重复的特点,但是它是无序存储,即存的顺序和取出的顺序不一致,为了让他在不修改原来对象的情况下实现有序存储,Java类库里面实现了一个继承HashSet类的子类LinkedHashSet。这是我第一次接触Java中的设计模式,刚开始看的时候感觉很难理解,当自己动手去模拟实现这个过程的时候,才慢慢体会到这种设计模式的巧妙,所以编程语言的学习还是多多动手,下面是我学习过程中参考的资料。,下面是他们的部分源代码,加上了我的注释。...
2022-07-22 15:43:20 791 1
原创 JavaWeb——Cooike详解
Cookie并不是它的原意“甜饼”的意思,而是一个保存在客户机中的简单的文本文件,这个文件与特定的Web文档关联`在一起,保存了该客户机访问这个Web文档时的信息,当客户机再次访问这个Web文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性,因此它可以帮助我们实现记录用户个人信息的功能,而这一切都不必使用复杂的CGI等程序。举例来说,一个Web站点可能会为每一个访问者产生一个唯一的ID,然后以Cookie文件的形式保存在每个用户的机器上。......
2022-07-20 10:58:57 331
原创 JavaWeb——Servlet详解
Servlet(ServerApplet)是JavaServlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。...............
2022-07-15 01:51:35 3409 2
原创 JDBC —— 数据库连接
JDBC全称为,直译过来就是Java数据库连接。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现。我们要连接数据库,就要去相应的数据库官网下载驱动,驱动都是以jar包的形式存在,jar包当中有很多.class文件,这些class文件就是JDBC接口的实现。本文针对MySQL数据库的连接实现。数据库连接完整代码如下:在注册驱动时,我们现在并不会这样写,因为com.mysql.cj.jdbc.Driver类的源码中有如下静态代码块:我们在这里简单的利用数据库实现一个账号的登录。
2022-06-24 16:28:25 330 1
原创 第298场力扣周赛个人题解
力扣:5242.兼具大小写的最好英文字母力扣:5218.个位数字为K的整数之和力扣:6099.小于K的最长二进制子序列力扣:5254卖木头块
2022-06-19 17:42:30 1693 2
原创 Mysql——事务详解(Transaction)
事务:是一个完整的业务逻辑单元,不可再分,和事务相关的语句只有DML语句(insert,update,delete)。注意:rollback和commit之后事务自动结束。自动提交的开启和关闭开启和关闭自动提交如下:4.事务的隔离级别4.1事务存在的常见问题隔离级别分类:查看隔离级别查看会话级当前的隔离级别:select @@session.transaction_isolation;查看全局级当前的隔离级别:select @@global.transaction_isolation;设置隔离级别
2022-06-15 16:18:05 972 9
原创 Java数据结构——平衡二叉树(AVL树)
AVL树的引入搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以下极端情况:这样的二叉树搜索效率甚至比链表还低。在搜索二叉树基础上出现的平衡二叉树(AVL树)就解决了这样的问题。当平衡二叉树(AVL树)的某个节点左右子树高度差的绝对值大于1时,就会通过旋转操作减小它们的高度差。基本概念AVL树本质上还是一棵二叉搜索树,它的特点是:本身首先是一棵二叉搜索树。每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)
2022-05-31 18:08:47 3399 12
原创 java反射机制
文章目录反射的概述获取Class对象的三种方式通过反射机制获取类的属性通过反射机制访问Java对象的属性反射机制与属性配置文件的配合使用资源绑定器配合使用样例通过反射机制获取类中方法通过反射机制调用Java对象的方法通过反射机制获取类中的构造方法通过反射机制创建对象(调用构造方法)通过反射机制获取一个类的父类和父接口反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能
2022-05-28 22:11:49 171 1
原创 Java数据结构——排序二叉树
排序二叉树概念二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。对于二叉排序树的任何一个非叶子节点, 要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。对二叉排序树进行中序遍历,结果就是按从小到大排序的。排序二叉树类的定义public class binarySortTree { class Node{ int value; Node left;
2022-05-25 20:07:27 900 1
原创 Java-lambda表达式
lambda表达式的语法语法如下:(参数) ->{表达式}注意:没有参数时,( ) 不能省略,就像无参构造那样。当可以推断出表达式的参数类型,可以将参数类型省略。当只有一个参数,且参数类型可以推断出,那么可以将 ( ) 省略。无需指定lambda表达式的返回类型,返回类型总是可以根据上下文推导而出。当表达式只有一个语句,并且没有返回值,可以省略 { }。labdam表达式的使用只有一个抽象方法的接口称为函数式接口,当我们需要这样的接口对象时,我们就可以用lambda表达式来代
2022-05-23 22:06:24 302 1
原创 Java多线程
Java线程状态Java中有如下6种状态New(新创建)Runnable(可运行)Blocked(阻塞)Waiting(等待)Timed waiting(计时等待)Terminated(被终止)新建状态 :使用new关键字创建一个thread对象,刚刚创建出的这个线程就处于新建状态。在这个状态的线程没有与操作系真正的线程产生关联,仅仅是一个java对象。可运行:正在进行运行的线程,只有处于可运行状态的线程才会得到cpu资源。可运行状态可以分为两类理解:就绪状态和运行状态:
2022-05-23 20:44:54 370 1
原创 Java数据结构——哈希表
文章目录哈希表概念哈希函数的构造平均数取中法折叠法保留余数法哈希冲突问题以及解决方法开放地址法再哈希函数法公共溢出区法链式地址法哈希表的填充因子代码实现哈希函数添加数据删除数据判断哈希表是否为空遍历哈希表获得哈希表已存键值对个数哈希表概念散列表,又称为哈希表(Hash table),采用散列技术将记录存储在一块连续的存储空间中。在散列表中,我们通过某个函数f,使得存储位置 = f(关键字),这样我们可以不需要比较关键字就可获得需要的记录的存储位置。散列技术的记录之间不存在什么逻辑关系,它
2022-05-22 17:50:09 1315 4
原创 中缀和后缀表达式的求值,以及相互转换
文章目录中缀表达式中缀表达式的计算利用双栈来实现中缀表达式的计算利用单栈实现中缀表达式计算后缀表达式后缀表达式的计算中缀表达式转后缀表达式中缀表达式中缀表达式(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是中缀形式处于操作数的中间(例:3 + 4,3 + 5 * 4 - 2),中缀表达式是人们常用的算术表示方法。如何编写一个程序,直接指向计算中缀表达式呢?下面我提供两种方法。中缀表达式的计算利用双栈来实现中缀表达式的计算中缀表达式以字符串的显示给出,例:“30 - 2 * 22 -
2022-05-13 22:22:13 729 1
原创 Java实现链表
之前拿C语言实现了链表操作,这篇博客拿Java实现,以备自己复习。public class LinkedList<E> { class Node<E>{ //所存储元素 E e; //指向下一个节点的引用 Node<E> next; Node(E e,Node<E> next){ this.e = e; this.ne
2022-05-10 21:35:44 433 3
原创 数组实现环形队列(Java)
实现思路:front 表示指向队列第一个元素,初始化为0。rear 表示指向队列最后一个元素的后一个位置,初始化为0。数组实现环形队列需要预留一个空位置(不放元素)。当队列已满时,满足:(rear + 1) % capacity == front当队列为空时,满足:(rear + capacity - front) % capacity == 0当出队列时,front变化满足front = (front + 1) % capacity队列元素个数等于(rear +
2022-05-09 21:58:00 403 1
原创 Java中的泛型
文章目录为什么要使用泛型程序定义泛型类定义泛型方法类型变量的限定为什么要使用泛型程序使用泛型前:public class GenericTest01 { public static void main(String[] args) { List l = new ArrayList(); l.add("abcd"); l.add(100); for(Object obj : l){ String s = (S
2022-05-08 21:38:40 930 2
原创 Java中容器学习(一) —— Collection和Map
文章目录🌲1.集合的继承结构图🥦1.1Collection接口的继承结构图🌿1.2Map接口的继承结构图🌵2.Collection接口中常用方法🌳2.1contains()方法详解🍀2.2 remove()方法详解🌾3.集合的遍历——迭代器🥬3.1迭代器中的常用方法🍏迭代器的原理🌲1.集合的继承结构图🥦1.1Collection接口的继承结构图🌿1.2Map接口的继承结构图🌵2.Collection接口中常用方法🌳2.1contains()方法详解contains()方法的用法很简单,如下
2022-05-04 18:05:46 1460 3
原创 Java中的异常处理
1.🍧异常的基本概念🍰Java中异常是以类的形式存在,每一个异常都可以创建异常对象现实中的例子:火灾(异常类)2008年1月1日,小明家着火了。(异常类对象)2008年1月2日,小亮家着火了。(异常类对象)2008年1月3日,小红家着火了。(异常类对象)public class ExceptionTest01 { public static void main(String[] args) { ArithmeticException x = new Ari
2022-04-23 20:04:40 1213 12
原创 数据结构 —— 线索二叉树
线索二叉树的意义对于一个有n个节点的二叉树,每个节点有指向左右孩子的指针域。其中会出现n+ 1个空指针域,这些空间不储存任何事物,浪费着内存的资源。对于一些需要频繁进行二叉树遍历操作的场合,二叉树的非递归遍历操作过程相对比较复杂,递归遍历虽然简单明了,但是会有额外的开销,对于操作的时间和空间都比较浪费。我们可以考虑利用这些空地址,存放指向节点在某种遍历次序下的前驱和后继节点的地址。通过这些前驱和后继节点的地址可以知道,从当前位置下一步应该走向哪里。线索二叉树的定义指向前驱和后继的指针称为线索
2022-04-16 15:16:08 3194 1
原创 Java中的八种包装类
文章目录为什么需要包装类?Java提供的八种包装类装箱和拆箱整数型常量池Integer中的常用方法int 、Integer、String之间的相互转换为什么需要包装类?读以下程序:public class IntegerTest01 { public static void dosome(Object obj){ System.out.println(obj); } public static void main(String[] args) { }
2022-04-11 20:53:35 1970 1
原创 数据结构——排序算法
插入排序直接插入排序堆排序概念堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。堆的两个特性结构性:堆是用数组表示的完全二叉树,我们可以用数组下标来表示父子结点的关系。这里随便给出一个数组:将数组以完全二叉树的形式表示出来:我们可以推出父子结点与二叉树的关系: LeftChild = Parent* 2 - 1 RightChild = Parent* 2 - 2 Parent = (Chird - 1) / 2有序性:任意一个结点的值都大于或者等于左
2022-03-27 19:04:46 2310 1
原创 Java——String类以及StringBuffer、StringBuilder
文章目录String类基本概念String字符串的存储原理String类的常用构造方法String类中常用方法StringBuffer类StringBuilder类String类基本概念String类属于引用数据类型,不属于基本数据类型。在Java中只要是" "(双引号)中的,都是String对象。java中规定,双引号中的字符串是不可变的,也就是说"abc"自出生到死亡都不可能变成"abcd",也不能变成"ab"。在JDK中双引号括起来的字符串都是存储在方法区的字符串常量池当中的。(因为在实际
2022-03-20 18:23:58 362
原创 Object类中的方法
equals方法源代码: public boolean equals(Object obj) { return (this == obj); }SUN公司设计equals方法目的?equals方法的设计初衷是判断两个对象是否相等,但是源代码中通过“ == ” 来判断是明显不行的,通过 “ = = ”来判断的仅仅是二者的内存地址。例如以下代码:public class Test { public static void main(String[] args) {
2022-03-20 14:03:04 299
原创 数据结构 —— 二叉树
二叉树分类满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。也可以理解为每一层的结点数都达到最大值的二叉树。完全二叉树一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。简单的说,完全二叉树就是最后一层可以有缺失的满二叉树(完全二叉树是一种特殊的满二叉树),并且是从右往左的缺失。二叉树性质若规定根节点的层数为1,则一棵树非空二
2022-03-17 21:39:58 830
原创 Java中的抽象类和接口
抽象类什么是抽象类?类和类之间有共同特征,将这些共同特征提取出来进一步抽象,就形成了抽象类。由于类是不存在的,所以抽象类无法创建对象。抽象类属于什么类型?抽象类也属于引用数据类型。抽象类怎么定义?[修饰符列表] abstract class 类名{ 类体;}抽象类是干什么的?抽象类无法实例化,无法创建对象,所以抽象类是用来被子类继承的,抽象类中构造方法可以供子类使用。final与abstract是对立的两个关键字,不能联合使用。什么是抽象方法?抽象方法表示没有实现的方法,没有方
2022-02-26 02:00:44 577 2
空空如也
数组 初始化问,为什么arr(0)还是没有初始化
2021-10-24
实验室面试的一个题,希望得到解答
2021-10-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人