自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis持久化方式

rdb使用生成快照的方式进行持久化:生成一个快照文件保存当前时刻redis的数据。具体有俩种触发方式:手动触发 和 自动触发.手动触发有俩种方式:save和bgsave。save:阻塞当前线程向快照文件中写入数据(默认叫做dump.rdb,路径在配置文件中设置)。bgsave:使用执行folk操作(Linux提供的一个创建子进程的api)创建出一个子线程,子进程相当于父进程的一个副本,子线程会生成一个新的快照文件,完成后替换原本的快照文件并通知父进程。

2024-01-13 14:36:47 904

原创 HashMap将值映射到哈希数组上的过程

因为哈希数组的长度远远达不到2^16.后续通过hash计算在hash数组的位置时用不到高16位。面试遇到一个问题:hashmap将值映射到hash数组上的具体过程,答得不好,所以在此重新梳理一遍。的哈希函数将原始哈希码的高位信息与低位信息结合在一起,产生了更加均匀分布的新哈希值。p即为所要插入到的hash数组的位置的索引,通过(n-1)& hash计算得出。的内部数组中更均匀地分布数据,从而减少了哈希冲突,提高了数据结构的整体性能。hashmap规定数组的长度必须为2的倍数,当长度为2的倍数时,

2024-01-08 12:34:11 372

原创 Redis初识

官方解释:The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and messagebroker.:开源的内存数据存储被数百万开发人员用作数据库、缓存、流引擎和消息代理。

2023-11-20 12:09:33 56

原创 初识分布式系统

但是如果用户量和数据量非常高的时候(高并发和大量数据存储),一台主机的资源终究是有限的(cpu性能,网络,硬盘,内存等),这时就要引入分布式系统了(多台主机)。:主服务器负责执行写的操作(一般是一个),从服务器负责读的操作(多个),设置更多的从服务器,这样可以最大效率的缓解存储服务器的访问压力。现代计算机的性能已经非常高了,所以在用户量和数据量不是非常非常高的时候,在一台主机上部署应用服务和数据库服务程序就可以满足我们的需求。在上述的单机架构的基础上,我们将应用服务和数据库服务分别部署在不同主机上,

2023-11-19 16:40:54 64

原创 CGlib动态代理和jdk动态代理相关

AOP (Aspect Oriented Programing) ⾯向切⾯编程。是以切⾯为基本单位的程序开发,通过切⾯间的彼此协同,相互调⽤,完成程序的构建。(本质即spring动态代理开发,通过代理类为原始类增加功能)(切⾯ = 切⼊点 + 额外功能)。

2023-11-06 19:31:19 51

原创 jvm(内存划分,双亲委派模型,垃圾回收机制)

保存程序中创建的所有对象。关系Java 虚拟机栈的生命周期和线程相同,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于局部变量当方法执行完毕后,Java虚拟机会将该栈帧弹出,并回收栈帧所占用的内存空间。本地方法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使用的,而本地方法栈是给本地方法使用的(jvm内部用c++实现的代码)。方法区的作用:用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 的。记录当前程序执行到哪个指令了。

2023-10-16 10:03:16 65

原创 Linux常用命令

mv可以实现一个回收站的效果,先创建一个trash文件夹,以后要删除文件时,不要使用rm进行删除,直接使用mv移到trash文件夹中,达到一个回收站的效果。:用来查询根目录下的内容,‘/‘在Linux中表示 根目录,相当于Windows中的’此电脑‘,云服务器任何一个文件/目录都属于根目录。mv可以在目标文件的路径上具体到文件名称来达到一个改名的效果,如果目标文件那只有一个文件名没有路径,就相当于对当前文件改名。不像cp需要大规模读写硬盘。cp也是一个非常危险的操作,它进行复制时会覆盖掉原本的内容。

2023-10-14 11:53:34 35

原创 HTTPS与网络安全

HTTPS(HyperText Transfer Protocol Secure)是一种用于安全传输数据的网络通信协议。它是HTTP的安全版本,用于确保在客户端(通常是Web浏览器)和服务器之间传输的数据是加密的、完整的和安全的。为什么要将HTTP升级到HTTPS?在互联网上,明文传输是非常危险的,除了会发生“运营商劫持”之外,还有可能被黑客用类似的手段进行劫持, 来窃取用户隐私信息, 或者篡改内容。所以。

2023-10-03 13:40:01 34

原创 HTTP协议

因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 "报头的结束标记", 或者 是 "报头和正文之间的分隔符". HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 "粘包问题".

2023-10-03 10:30:48 52

原创 UDP + TCP协议详解

UDP(User Datagram Protocol)是一种面向无连接的传输层协议。与TCP(Transmission Control Protocol)相比,UDP提供了一种简单、轻量级和低延迟的数据传输机制。

2023-09-27 21:47:18 152

原创 利用tcp,udp套接字分别写一个简单的回显程序

DatagramSocket是Java中用于实现UDP协议的套接字类。它提供了在网络上发送和接收UDP数据报的功能。

2023-09-20 15:48:56 36 1

原创 JUC(java.util.concurrent)包的一些类 和 一些线程安全的集合类

Callable接口是Java中的一个函数式接口,它允许Callable也是一种创建线程的方式。但是与Runnable不同的是,即:Runnable关心过程(比如定时器,线程池中都是使用Runnable创建新线程),Callable关心结果(比如要让线程计算一个公式)。需要注意的是,Callable不能直接作为Thread的参数,通常需要搭配FutureTask使用。因为Callable线程什么时候执行完并产生返回值我们并不确定,什么时候去接收就不确定。FutureTask的get方法解决了这个问题,

2023-09-19 12:40:04 41

原创 CAS的实现及应用

CAS(Compare and Swap)是一种乐观锁,用于实现多线程环境下的同步。。当执行CAS操作时,如果内存位置的值等于期望值,那么就将内存位置的值更新为新值,否则什么都不做。CAS操作是原子的,因此CAS操作是由CPU底层的原子指令实现的,下图是我们根据CAS原理写出来的伪代码:上述过程只是对CAS的拙劣的还原。

2023-09-16 13:26:40 55 1

原创 锁策略(锁策略的简单介绍以及synchronized的锁策略)

总是假设好的情况,认为多线程对数据进行更新的时候不会发生冲突,所以如果没有发生冲突就正常更新数据,如果发生冲突,就需要重新读取数据并重试操作 或者返回错误信息,让用户重新决定如何去做。总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以,实现方式之一就是CAS。因此,我们将一把锁分为两部分:读锁和写锁,其中,因为读操作本身是线程安全的,而,不允许多个线程同时获得写锁,读写锁可以提高并发性,适合于读操作频繁的情况。锁的核心特性 "原子性", 这样的机制追根溯源是 CPU 这样的硬件设备提供的.

2023-09-15 15:16:15 62

原创 多线程 之 线程池(概念,创建方法介绍,实现一个简单的线程池)

作用:创建一个固定线程数量的线程池。上述参数中的int即为自定义的线程池的固定线程数量。至于ThreadFactory,是一个用于创建新线程的工厂。在创建线程池时,可以通过指定ThreadFactory参数来自定义线程的创建方式,从而实现更加灵活和个性化的线程池配置,这里就不展开说明(我不会用)。在使用newFixedThreadPool()方法创建线程池时,需要根据实际情况合理设置线程数量,以保证系统的性能和稳定性。如果线程池中的线程数量过小,可能会导致任务处理速度过慢,影响系统的响应能力;

2023-09-13 18:11:01 130 2

原创 简单的阻塞队列 和 定时器实现

队列满的时候,put方法阻塞,直到take方法拿出元素时唤醒队列为空的时候,take方法阻塞,直到put方法放进元素时唤醒。

2023-09-13 11:43:18 71 1

原创 单例模式(懒汉模式和饿汉模式)

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问该实例。在单例模式中,该类的构造函数被私有化,以防止其他对象创建该类的实例,同时提供一个静态方法来获取该类的唯一实例。

2023-09-10 19:26:42 52 1

原创 java 线程安全

线程安全问题是指在多,多个线程同时访问共享资源时可能会出现的问题。由于多个线程同时运行,可能会导致数据竞争、死锁、活锁等问题,从而影响程序的正确性和性能。

2023-09-09 12:21:08 48 1

原创 线程与进程的区别和联系

一个线程就是一个 "执行流",且是“执行流”的最小单位, 每个线程之间都可以按照顺序执行自己的代码.,多个线程之间 "同时" 执行着多份代码.

2023-09-04 16:22:54 46 1

原创 进程的基本概念以及进程的调度方式

系统基于资源分配的角度将一个应用程序划分成多个可执行程序,我们运行这个应用程序,这些可执行程序就从磁盘加载到内存中,进而被创建成一个个进程,这些进程最重要的部分就是其PCB,PCB中有进程调度的各种信息。系统将这些PCB按照线性,链接,索引等方式在内存中组织起来以方便管理。cpu根据PCB的中提供的优先级,状态,cpu记账信息等对这些进程进行调度,执行,实现其并发执行。

2023-09-02 20:34:47 74 1

原创 Java Hashmap源码分析

Node节点包括四个内容:哈希值hash,关键字key,元素value,next指针,并针对这些内容有对应的方法。这里重点看一下其当我们向hashmap中存入自定义类型的键值key时需要重写hashCode和equals方法(后面会讲)

2023-08-31 17:01:33 109 1

原创 数据结构之 排序(Java实现)

从算法的简单性来看,我们将7种算法分为以下两类。简单算法:冒泡、简单选择、直接插入。改进算法:希尔、堆、归并、快速。从平均情况来看,显然最后3种改进算法要胜过希尔排序,并远远胜过前3种简单算法。从最好情况看,反而冒泡和直接插入排序要更胜一筹,也就是说,如果你的待排序序列总是基本有序,反而不应该考虑4种复杂的改进算法。从最坏情况看,堆排序与归并排序又强过快速排序以及其他简单排序。从这三组时间复杂度的数据对比中,我们可以得出这样一个认识。

2023-08-29 11:32:37 234

原创 java 静态代码块,实例代码块 构造方法执行顺序以及在继承关系下它们的执行顺序

静态代码块 > 实例代码块 > 构造方法、*1:静态代码块只在,实例代码块和构造方法先后执行。

2023-07-04 15:45:45 375 2

原创 Java面向对象----多态

例如对一群动物,针对使其发生叫声这一行为,当这个行为作用在不同动物,会产生不同的结果:狗是汪汪,猫是喵喵,牛是哞哞,青蛙是呱呱。行为在Java中就是方法,不同的动物就是不同的对象。多态在Java中的实现就是:在继承体系下,当不同对象调用同一种方法时,通过向上转型,方法重写来实现动态绑定,。1. 必须在继承体系下2. 子类必须要对父类中方法进行重写3. 通过父类的引用调用重写的方法动态绑定也叫运行时绑定,是运行时刻能够自动选择调用哪个方法的现象。

2023-06-19 09:29:00 21

原创 java泛型实现顺序表

【代码】java泛型实现顺序表。

2023-05-29 10:37:53 67 1

原创 java面向对象——继承

我们这里的访问都是从测试类和子类的角度看,继承是单向的访问关系,父类只能访问自己的成员方法和变量。

2023-05-24 01:19:13 25

原创 java实现简单的克隆(调用Object的clone方法和浅拷贝,深拷贝)

的clone方法是protected修饰需要在克隆类中重写2:编译时异常/受查异常3:向下转型时需要强制类型转换4:克隆类需要设置标记接口。

2023-05-15 18:02:37 1318 1

原创 JAVA面向对象1——封装

基本规则:1.在文件的最上方加上一个package语句表明该代码在哪个包中2.如果一个类没有package语句则该类被放到一个默认包src中3.包名要和代码路径相匹配.(通过 . 来设置包的子包)例:创建一个包com和它的子包baidi和baidu的子包www4.包名需要尽量指定成唯一的名字.

2023-05-08 15:28:13 23 1

原创 java运算符基础(详解)

概念:执行数学运算时对操作数进行操作的符号。

2023-04-15 12:45:38 677 1

原创 C语言指针理解及细节

应用:二维数组的首元素是其第一行,所以二维数组的数组名就表示其第一行的地址,这时就需要用到数组指针。对于&arr,因为它表示这个数组,所以对它加一,它跨过这个数组的大小即4*5=20;数组指针本质上还是一个指针,和int*,char*一样,数组指针是一个指向数组的指针。a的地址存放在ap中,ap的指针存放在app中,ap是一级指针,app是二级指针。形式:返回类型 (*指针名[元素数量])(参数类型)={数组中存放的函数名};*我们平常口语所说的指针其实是指针变量,即用来存放指针(地址)的变量。

2023-04-02 16:41:35 109 2

空空如也

空空如也

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

TA关注的人

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