自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 收藏
  • 关注

原创 GO中的文件操作

文件的写入,我们首先需要通过 os.OpenFile打开文件。文件比较少的时候,可以通过ioutil来读取文件。2.1 通过openfile 打开文件写入。1.1 通过os.open方法读取文件。1.2 通过bufio的方式读取。1.3 通过ioutil读取。2.2 通过bufio写入。2.3 通过iouti写入。

2024-10-31 02:36:18 314 1

原创 go的反射

1.介绍有时我们需要写一个函数,这个函数有能力统一处理各种值类型,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在,这个时候我们就可以用到反射。空接口可以存储任意类型的变量,那我们如何知道这个空接口保存数据的类型是什么?值是什么呢?把结构体序列化成json字符串,自定义结构体Tab标签的时候就用到了反射,ORM框架,底层就是用到了反射技术。

2024-10-30 02:44:40 1064

原创 channel管道

当向管道中发送完数据时,我们可以通过close函数来关闭管道,当管道被关闭时,再往该管道发送值会引发panic,从该管道取值的操作会去完管道中的值,再然后取到的值一直都是对应类型的零值。其实,当我们对一个不会变化的数据只做“读”操作的话,是不存在资源竞争的问题的。因为数据是不变的,不管怎么读取,多少goroutine同时读取,都是可以的。有时候我们会将管道作为参数在多个任务函数间传递,很多时候我们在不同的任务函数中,使用管道都会对其进行限制,比如限制管道在函数中只能发送或者只能接受。

2024-10-29 02:47:06 877

原创 golang中的goroutine

可以理解为用户级线程,这是对内核透明的,也就是系统并不知道有协程的存在,是完全由用户自己的程序进行调度的。OS线程(操作系统线程)一般都有固定的栈内存(通常为2MB左右),一个goroutine(协程)占用内存非常小,只有2KB左右,多协程goroutine切换调度开销方面远比线程要少。:(可以理解为线程/也可以理解为进程),在一个Golang程序的主线程上可以起多个协程。多协程和多线程:Golang中每个goroutine(协程)默认占用内存远比Java、C的线程少。1.3.1 协程计数器的简单使用。

2024-10-28 02:40:35 552

原创 golang接口

接口体现了程序设计的多态和高内聚低耦合的思想N Golang中的接口也是一种数据类型,不需要显示实现。在golang中,允许接口嵌套接口,我们首先创建一个 Animal1 和 Animal2 接口,然后使用Animal接受刚刚的两个接口,实现接口的嵌套。Golang中的接口可以不定义任何方法,没有定义任何方法的接口就是空接口。一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的。如果结构体中的方法是值接收者,那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量。

2024-10-24 02:45:12 855

原创 go mod的使用

包就是很多golang源码的集合,Go语言为我们提供了很多内置包,如fmt、strconv、strings、sort、errors、time、encoding/json、os、io等。依赖包会自动下载到 $GOPATH/pkg/mod目录,并且多个项目可以共享缓存的mod,注意使用go mod download的时候,需要首先在你的项目中引入第三方包。go init:在当前文件夹下初始化一个新的module,创建go.mod文件。搜索我们想用的包,比如搜索一个有关json操作的包,我们进去后,找到它的。

2024-10-23 02:38:26 1303

原创 golang中的函数和结构体

在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。4.4.1 Golang JSON序列化是指把结构体数据转化成JSON格式的字符串,Golang JSON的反序列化是指把JSON数据转化成Golang中的结构体对象。结构体首字母可以大写也可以小写,大写表示这个结构体是公有的,在其它的包里面也可以使用,小写表示结构体属于私有的,在其它地方不能使用。1.2 方法作为参数。3.type 关键词。

2024-10-22 01:07:42 535

原创 golang的数组、slice和map

切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。切片(Slice)是一个拥有相同类型元素的可变长度的序列。切片拥有自己的长度和容量,我们可以通过使用内置的len()函数求长度,使用内置的cap() 函数求切片的容量。map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用。在golang中,切片的定义和数组定义是相似的,但是需要注意的是,切片是引用数据类型。1.2 数组是值类型,赋值和传参会赋值整个数组,因此改变副本的值,不会改变本身的值。

2024-10-21 00:55:23 509

原创 golang 基本数据类型

golang的数据类型分为两大类,一类是基本数据类型和符合数据类型;按照传递的内容分:传递本身数据和传递地址;golang和java很相似,都是值传递,不过分为传递的值和传递的地址,传递地址的叫做引用传递;

2024-10-20 02:52:42 697 1

原创 mysql-MVCC

使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。InnoDB只查找版本早于当前事务版本的数据行,即,行的系统版本号小于或等于事务的系统版本号,这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。是MVCC技术用的比较多的。

2024-07-22 15:13:39 561 1

原创 mysql-数据库索引

索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。

2024-07-21 17:33:28 788

原创 mysql架构之select语句执行流程

以上信息是默认配置,其注释意思是说,MYSQL的查询缓存用于缓存select查询结果,并在下次接收到同样的查询请求时,不再执行实际查询处理而直接返回结果,有这样的查询缓存能提高查询的速度,使查询性能得到优化,前提条件是你有大量的相同或相似的查询,而很少改变表里的数据,否则没有必要使用此功能。当mysql服务器启动(mysql服务器就是一个进程),等待客户端连接,每一个客户的连接请求,服务器都会创建一个新的线程处理(如果是线程池的话,则是分配一个空的线程),每个线程都是独立的,拥有各自的内存处理空间。

2024-07-21 17:18:01 1023

原创 JVM之经典垃圾回收器

处理范围划分:新生代垃圾回收器:serial、parNew、parallel scavenge;老年代垃圾回收器:serial Old、parallel Old、CMS;整堆收集器:G1、ZGC;

2024-07-21 13:21:40 696

原创 设计模式之单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。

2024-07-21 08:55:54 323

原创 java并发之重排序问题

在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序分3种类型。1编译器优。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。2级。现代处理器采用了指令级并行技术ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。3统。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

2024-07-19 11:57:55 722

原创 Java并发之线程通讯

Exception Handler Parameters)不会在。程都有一个私有的本地内存(Local Memory。通信的工作机制,很可能会遇到各种奇怪的内存可见。同步是指程序中用于控制不同线。2.Java并发采用的通信方式。首先会把自己本地内存中修改后的。在消息的接收之前,因此同步是。冲区、寄存器以及其他的硬件和。存放在自己的本地内存A中。,也不受内存模型的影响。的一个抽象概念,并不真实。式指定某个方法或某段代。

2024-07-18 00:38:31 875

原创 HotSpot的算法细节实现

我们以可达性分析算法中从GC Roots集合找引用链这个操作作为介绍虚拟机高效实现的第一个例子。固定可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,尽管目标明确,但查找过程要做到高效并非一件容易的事情,现在Java应 用越做越庞大,光是方法区的大小就常有数百上千兆,里面的类、常量等更是恒河沙数,若要逐个检查以这里为起源的引用肯定得消耗不少时间。1.2 根节点枚举产生的问题。

2024-07-17 14:25:20 717

原创 原子操作的实现原理

1.原子操作下使用的方法原子(atomic)本意是不能被进一步分割的最小粒子”,而原子操作()意为不可被中断的一个或一系列操作。1.原子操作下使用的方法。

2024-07-17 11:36:29 1082

原创 锁升级过程中的两次自旋 面试重点

自旋(Spinning)是一种在多线程环境下等待锁的技术。当一个线程尝试获取某个已被其他线程持有的锁时,该线程不会立即进入阻塞状态,而是会在一个循环中持续检查锁的状态,即“自旋”。如果在这个过程中锁被释放了,那么该线程就可以立即获取锁,从而避免了线程阻塞和上下文切换的开销。

2024-07-17 10:56:59 769

原创 synchronized的实现原理和锁升级 面试重点

未被锁定的对象的该计数器为0,当一个线程获得锁(执行 monitorenter)后,该计数器自增变为 1,当同一个线程再次获得该对象的锁的时候,计数器再次自增。锁将被释放,其他线程便可以获得锁。无论是给静态方法或者非静态方法,加上synchronized标识,都是锁的对象,synchronized的普通方法,其实锁的是具体调用这个方法的实例对象,而synchronized的静态方法,其实锁的是这个方法锁属于的类对象。如果一个线程已经获得锁,在锁未释放之前,再次请求锁的时候,是必然可以获得锁的。

2024-07-17 10:29:00 1114

原创 volatile的应用

volatile修饰的共享变量,其他线程进行读操作时,总能读到最新的数据。volatile修饰的共享变量,其他线程进行写操作时,直接写在主内存中,并不是缓存。volatile保证数据的可见性和顺序性。

2024-07-17 01:27:52 1149

原创 java并发和多线程之并发面临的性能问题

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。1.2 问题多线程不一定快因为线程有创建和上下文切换的开销,上下文切换的开销比直接用单线程大,因为在多线程中,需要保存和恢复更多的上下文信息。

2024-07-16 17:58:51 1071

原创 redis 集群模式

Redis ⽀持三种集群模式,分别为Cluster。最初,Redis采⽤主从模式构建集群。在这种模式下,如果主节点(master)出现故障,需要⼿动将从节点(slave)转换为主节点。然⽽,这种模式在故障恢复⽅⾯效率不⾼。为了提⾼系统的可⽤性,Redis引⼊了哨兵模式。在哨兵模式中,⼀个哨兵集群负责监控主节点和从节点。如果检测到主节点故障,系统可以⾃动将从节点晋升为新的主节点。这提⾼了故障恢复的⾃动化程度。

2024-07-14 17:21:56 916

原创 贪心算法案例

的区间 (li​,ri​] 使得如下的等式最大化,res = (prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0]) = prices[3] - prices[0]。假如元素把比他小,赋值给该变量,否则让该元素减去minPrice当前最小元素,如果比已知的最大利润大,那就赋值给最大利润。解法:遍历数组每一个元素,设置一个变量为minPrice为整数类型最大数,让每个元素跟他比较,如果你不能获取任何利润,返回。

2024-07-14 11:30:37 493

原创 html02-标签继续学习

帮助中心账户管理购物指南订单操作

2024-07-14 09:18:00 883

原创 JVM 垃圾回收算法

举个例子,如果某个新生代对象存在跨代引用,由于老年代对象难以消亡,该引用会使得新生代对象在收集时同样得以存活,进而在年龄增长之后晋升到老年代中,这时跨代引用也随即被消除了。缺点:尤其是在老年代这种每次回收都有大量对象存活区域,移动存活对象并更新所有引用这些对象的地方将会是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用程序才能进行。两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。

2024-07-14 01:05:08 595

原创 JVM GC垃圾回收机制之对象存活判断

在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。在方法区中常量引用的对象,譬如字符串常量池()里的引用。在本地方法栈中JNI(即通常所说的Native方法)引用的对象。Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、)等,还有系统类加载器。所有被同步锁(关键字)持有的对象。

2024-07-13 23:12:10 765

原创 JVM OutOfMemoryError异常模拟

Java堆用于储存对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会 产生内存溢出异常。限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX可以让虚拟机 在出现内存溢出异常的时候Dump出当前的内存堆转储快照以便进行事后分析。

2024-07-13 18:03:20 443

原创 JVM 之对象的结构与创建

(1)假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump The Pointer)就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分 配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称 为“如果没有,那 必须先执行相应的类加载过。

2024-07-13 00:49:14 989

原创 JVM运行时数据区

程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的 字节码的行号指示器。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。

2024-07-13 00:16:32 1342

原创 双指针算法

给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。pos。仅仅是为了标识链表的实际情况。如果链表中存在环,则返回true。否则,返回false。解法:创建两个指针,一个快指针一个慢指针,一个走一步一个走两步,成环的链表肯定会相遇。

2024-07-12 10:03:49 640

原创 redis的持久化

产⽣⼀个⼦进程,快照持久化完全交给⼦进程来处理,⽗进程继续处理客户端请求。Redis是⼀个基于内存的数据库,它的数据是存放在内存中,内存有个问题就是关闭服务或者断电会丢失。⽂件重写了,但是毕竟是操作过程和操作结果仍然有很⼤的差别,体积也毋庸置疑的更⼤。),他们会共同获取相同的指针指向相同的资源,直到某个调⽤者试图修改资源的。是数据的快照,基本上就是数据的复制,不⽤重新读取再写⼊内存。候对磁盘的消耗也是不可忽视的,尤其在访问量很⾼的时候,主线程。重写,此过程不会影响主进程,重写完成后,新的写⼊将会写到新的。

2024-07-11 11:27:52 804 1

原创 redis 介绍和数据结构及如何实现

Redis(Remote Dictionary Server)是一个开源的、基于内存的、可选持久化的日志型Key-Value数据库编写,支持网络操作,并提供多种语言的API。Redis支持多种数据结构,包括字符串(string)、列表(list)、集合(set)、有序集合(zset)和哈希(hash),并且这些数据类型都支持丰富的操作,如push/pop、add/remove以及取交集、并集和差集等,这些操作都是原子性的。

2024-07-11 10:36:47 1099 1

原创 缓存击穿、缓存穿透、缓存雪崩以及应对措施

是指当某一key的缓存时间过期时大量并发量的请求同时访问此key,瞬间击穿服务器的直接访问数据库,让数据库处于负载的情况。

2024-07-10 19:19:24 278

原创 Spring AOP的几种实现方式

1.1导入依赖1.2定义注解1.2定义切面类。

2024-07-10 10:56:32 634

原创 aop的几种动态代理以及简单案例(1)

Sping AOP是通过动态代理模式实现的,具体有两种实现方式,一种是基于Java原生的动态代理,一种是基于cglib的动态代理。1.3使用springProxy创建代理对象代理该类,在每次调用方法前后写入要进行的逻辑。2.2创建代理方enhancer代理该类。1.4 使用该代理方法代理实现类。1.1创建需要被代理的方法接口。2.1创建需要被代理的对象。2.3生成代理对象使用方法。1.2实现编写方法逻辑。2.cglib动态代理。

2024-07-10 10:32:22 252

原创 重写equal之后为什么要重写hashcode

一:什么是equal和hashcode在Java钟equals()和hashcode()方法通常是成对的,它们在使用都是基于hash机制的数据结构非常重要,类如hashmap、hashSet和hashtable等。hashCode()hashCode()二、原因。

2024-07-10 10:05:16 273

原创 java类的加载顺序及复杂案例(阿里)

在Java中,类的初始化顺序涉及到多个方面,包括静态变量、静态初始化块、实例变量、实例初始化块(也称为构造器初始化块或初始化块)以及构造器的执行顺序。

2024-07-09 11:50:13 1126

原创 仿写SpringMVC

【代码】仿写SpringMVC。

2024-07-09 11:23:50 289

原创 仿写SpringIoc

2.创建一个controller和一个UserService对象,为后面案例展示提供方便。1.SpringIoc简单注解。4.使用test测试。

2024-07-09 11:04:15 300

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除