自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【计算机网络】网络模型

介绍了OSI七层参考模型、TCP/IP五层协议、TCP/IP四层协议。

2024-04-24 14:48:52 962

原创 【Linux】常用命令

介绍一些常用的操作文件的命令,有cd命令切换目录、创建目录mkdir、删除空目录rmdir、删除文件rm、复制文件cp、移动文件mv等等操作。

2024-04-23 19:02:14 1983 2

原创 【Linux】文件目录及路径表示

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。/etc: 这个是系统中的配置文件,如果更改了该目录下的某个文件可能会导致系统不能启动。/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。值得提出的是 /bin、/usr/bin 是给系统用户使用的指令(除 root 外的通用用户),而/sbin, /usr/sbin 则是给 root 使用的指令。

2024-04-23 18:43:45 814

原创 【Linux】文件基本属性

Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。在 Linux 中我们可以使用或者。

2024-04-22 18:39:03 595

原创 【Linux】概述与历史

Linux是基于Unix的。Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机。诞生于1991年10月5日。是由芬兰赫尔辛基大学学生Linus Torvalds和后来加入的众多爱好者共同开发完成。

2024-04-22 17:07:19 349

原创 【计算机网络】网络协议

网络协议:网络协议是为网络中数据的传输和交换建立的一种规则、标准或者约定。就像公共交通系统,开通了很多道路之后,驾驶员、行人等都需要遵守交通规则,来确保交通的正常运转。网络中的协议就想交通系统中的交通规则,在数据传输的过程中需要遵守这种规则,这样不同的终端才能准确地发送和接受数据。协议规定了通信实体之间所交换消息的格式、意义、顺序及针对收到信息或发生的事件所采取的“动作”。理解:协议规定了数据的格式、意义、顺序以及处理方式。

2024-04-15 17:35:25 699

原创 计算机网络

计算机网络是就是互连的、自治的计算机集合。互连:通过通信链路是计算机相互连接,从而可以传输信息、共享资源。通信链路:就是传输介质,比如光纤、电缆、双绞线、无线信号等。自治:计算机之间没有主从关系。指的是一个计算机不能去控制操作另外一台计算机,反之亦然。计算机网络的意义就是实现计算机之间的相互通信。全球最大的互联网络服务提供商--ISP(Internet Service Provider):网络互连的"网络之网络"。ISP的结构图。

2024-04-15 17:33:47 876

原创 手撕简单测试框架源码

测试框架的功能描述用户可以使用测试框架来测试指定的方法,将测试中的异常信息进行记录,包括出现异常的方法、方法原因、方法名称等。核心:能够获取到用户指定的测试方法,执行方法后捕获异常,并输出到文件中。实现思路注解+反射1.使用自定义注解,用于识别需要测试的方法。2.利用反射机制获取被注解标记的方法(也就是需要测试的方法),并执行方法。

2024-04-06 11:42:29 446

原创 【JavaSE】注解

注释:用文字描述程序的,是给程序员看的。注解:用来解释说明程序的,是给计算机看的。百度百科定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,解释。

2024-04-06 10:24:39 875

原创 【JavaSE】反射

正射是先创建对象,再访问类信息。反射是获取信息,再创建对象。

2024-04-05 19:42:23 1130 2

原创 【JavaSE】枚举

JDK5.0之前的枚举使用方式。​//定义枚举:因为这些对象都是固定且唯一的,所以用final static修饰。public final static Season SPRING = new Season("春天","春暖花开");public final static Season SUMMER = new Season("夏天","夏日炎炎");public final static Season AUTUMN = new Season("秋天","秋高气爽");

2024-04-04 19:05:02 306

原创 【JavaSE】内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。可以把内部类理解成寄生,外部类理解成宿主。匿名内部类:是内部类的简化写法。他是一个隐含了名字的内部类。开发中,最常用到的内部类就是匿名内部类了。

2024-04-04 15:42:38 925

原创 【MySQL】InnoDB引擎

Tablespace:表空间,一个数据库可以对应多个表空间。数据库中的每张表都有一个表空间,用来存放表记录、索引等数据。Segment:段,表空间中有多个段,而每个段中将表空间中的记录、索引等数据分为数据段、索引段、回滚段来存储。其中索引段就存储在B+树的非叶子结点,数据段就存储在叶子结点上。段中又管理多个区(Extent)。Extent:区,表的单元结构,每个区的大小为1M。默认情况下,InnoDB存储引擎的页大小为16k,那么每个区中就存储64个连续的页。Page:页,是InnoDB存储引擎。

2024-03-21 21:18:41 1961 1

原创 【JavaSE】之多态

编译看左边:Javac编译的时候在变量所属的类型里面找变量或者方法,如果找到了就编译成功,否则就编译失败。运行看右(左)边:运行的时候,执行的是对象所属类型中的方法。使用父类作为形参时,可以接受所有的子类。变量调用:编译看左边,运行也看左边。方法调用:编译看左边,运行看右边。多态就是指同类型对象有多种形态。父类类型 对象名 = 子类对象;:不能使用子类独有的属性和功能。体现了多态的扩展性与便利。有父类引用指向子类对象;

2023-09-10 17:05:35 260

原创 【Java】之继承

Java中使用extends关键字,让我们在类和类之间建立联系。使用继承的好处:可以将多个类中重复的代码,抽象至父类中供子类使用。子类可以在父类上的基础上继续增强,使子类可以有自己独特的性质和功能。特点:在Java中,只支持单继承,不支持多继承,但支持多层继承。

2023-09-10 16:02:20 273

原创 进程与线程

程序是一组指令的集合,它描述了完成特定任务的步骤和操作。程序通常以源代码的形式编写,可以使用编程语言如C、Java、Python等来表示。程序本身是,它只是存储在存储介质(如硬盘)上的一段代码。进程是计算机系统中的实例。当一个程序被执行时,操作系统会为其创建一个独立的进程。线程是。一个进程可以包含多个线程,它们共享进程的内存空间和系统资源。线程是操作系统调度的基本单位,可以并发执行。

2023-07-28 17:39:08 233

原创 【并发编程】ThreadLocal

TreadLocalMap 使用 ThreadLocal 的弱引用作为 key,如果一个 ThreadLocal不存在外部强引用时,Key(ThreadLocal)势必会被 GC 回收,这样就会导致ThreadLocalMap 中 key 为 null, 而 value 还存在着强引用,只有 thead 线程退出以后,value 的强引用链条才会断掉。最终的变量是放在了当前线程的ThreadLocalMap中 ,并不是存在 ThreadLocal 上,ThreadLocal 作为 key。

2023-07-28 00:49:46 542

原创 【并发编程】线程池

直到线程池中的线程数不大于 corePoolSize,即当线程池中的线程数大于 corePoolSize 时,如果一个线程空闲的时间达到 keepAliveTime,则会终止,直到线程池中的线程数不超过 corePoolSize。在创建了线程池后,默认情况下,在创建了线程池后,线程池中的线程数为 0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目。如果线程池中存活的核心线程数小于线程数 corePoolSize 时,线程池会创建一个核心线程去处理提交的任务。

2023-07-28 00:43:27 129

原创 ConcurrentHashMap

ConcurrentHashmap 和 Hashtable 都是支持并发的,这样会有一个问题,当你通过 get(k)获取对应的 value 时,如果获取到的是 null 时,你无法判断,它是 put(k,v)的时候 value 为 null,还是这个 key 从来没有做过映射。jdk8 放弃了分段锁而是用了 Node 锁,减低锁的粒度,提高性能,并使用 CAS 操作来确保 Node 的一些操作的原子性,取代了锁。里面是模糊不清的,所以压根就不让 put null。,分段锁反而会造成更新等操作的长时间等待。

2023-07-28 00:42:17 346

原创 ReentrantLock 锁实现

ReentrantLock 是 java.util.concurrent.locks 包下的类 , 实现 Lock 接口。NonfairSync 类继承了 Sync 类,表示采用非公平策略获取锁,其实现了 Sync 类中抽象的 lock 方法。FairSync 类也继承了 Sync 类,表示采用公平策略获取锁,其实现了 Sync 类中的抽象 lock 方法。来对共享资源进行同步,同时和 synchronized 一样,ReentrantLock。,除此之外,ReentrantLock 在调度上。

2023-07-25 15:07:33 152

原创 【并发编程】AQS

AQS 的全称为( AbstractQueuedSynchronizer ), 这个类在 java.util.concurrent.locks 包下面。AQS 是一个用来的框架,使用 AQS 能简单且高效地构造出同步器 , 是 JUC 中 核 心 的 组 件 ,比如我们提到的ReentrantLock,CountDownLatch 等等都是基于 AQS 来实现。只要搞懂了 AQS,那么 JUC 中绝大部分的 api 都能掌握。在内部有一个变量表示。

2023-07-25 15:02:32 151

原创 synchronized 锁实现

当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,该标记表明线程进入该方法时,需要 monitorenter,退出该方法时需要 monitorexit。,线程代码执行在进入 synchronized 代码块时候会自动获取内部锁,这个时候其他线程访问时候会被阻塞,直到进入 synchronized 中的代码执行完毕或者抛出异常或者调用了 wait 方法,都会释放锁资源。当前线程拥有了这个对象的锁,把锁的计数器+1;当计数器为 0 时,锁就被释放了。

2023-07-25 14:56:59 106

原创 Java 中的锁分类

乐观锁在 Java 中的使用,是无锁编程,常常采用的是 CAS 算法,典型的例子就是原子类,通过 CAS 自旋实现原子操作的更新。重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会。轻量级锁是指当锁是偏向锁的时候,此时又有一个线程访问,偏向锁就会升级为轻量级锁,其他线程会通过。由此可见,自旋锁是是比较消耗 CPU 的,因为要不断的循环重试,不会释放 CPU资源。读锁的共享锁可保证并发读是非常高效的,读写,写读 ,写写的过程是互斥的。

2023-07-22 14:48:20 95

原创 【并发编程】CAS

如原先的内存值为(A,1),线程将(A,1)修改为了(B,2),再由(B,2)修改为(A,3)。此时另一个线程使用预期值(A,1)与内存值(A,3)进行比较, 只需要比较版本号 1 和 3,即可发现该内存中的数据被更新过了。每次判断我的预期值和内存中的值是不是相同,如果不相同则说明该内存值已经被其他线程更新过了,因此需要拿到该最新值作为预期值,重新判断。当另外一个线程使用预期值去判断时,预期值与内存值相同,当前线程的 CAS 操作无法分辨当前 V 值是否发生过变化。的一种实现方式,他采用的是。

2023-07-22 14:45:33 141

原创 原子性的实现

synchronized 一定能保证原子性,因为被 synchronized 修饰某段代码后,无论是单核 CPU 还是多核 CPU,只有一个线程能够执行该代码,所以一定能保证原子操作。也就是说,一个获得锁的线程被CPU切换走了,即使其他线程来访问这段临界资源,由于锁被占用,也无法访问。synchronized 来保证原子性。:进程只能一个一个的执行,同时有多个进程,那么根据一定的规则(调度算法)选取一个执行,其他先等待。,例如Java 语言提供的 synchronized 关键字,就是锁的一种实现。

2023-07-22 14:40:50 185

原创 Volatile关键字

被volatile修饰的共享变量,对其他线程是可见的。禁止指令重排。volatile不能保证对变量操作的原子性。volatile可以解决不可见性和无序性,但不能保证原子性。

2023-07-22 14:39:03 78

原创 【并发编程】安全问题

缓存导致的可见性问题,编译优化带来的有序性问题,线程切换带来的原子性问题,。其实缓存、线程、编译优化的目的和我们写并发程序的目的是相同的,都是提高程序安全性和性能。但是技术在解决一个问题的同时,必然会带来另外一个问题,所以在采用一项技术的同时,一定要清楚它带来的问题是什么,以及如何规避。

2023-07-21 18:23:05 79

原创 Java内存模型(JMM)

Java 虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为 Java 内存模型。这里的工作内存是 JMM 的一个抽象概念,也叫本地内存,其存储了该线程读 / 写共享变量的副本。,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。Java 内存模型(Java Memory Model,JMM)Java 内存模型中规定了所有的变量都存储在。

2023-07-21 18:21:46 85

原创 缓存穿透、缓存击穿、缓存雪崩

2.加锁:上面的现象是多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后将数据放到 redis 缓存起来。前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取, 数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。,每次针对此 key 的请求从缓存获取不到, 请求都会到数据库,从而可能压垮数据库。,尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)。

2023-07-21 18:18:17 80

原创 【Redis】Key 过期策略

每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对 cpu 的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。:立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。redis 使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用。,当过期时间达到时,由时间处理器自动执行键的删除操作。,对 expires 字典进行检查,删除里面的过期键。,才会被检查到过期,此时才能得到删除。某个键值过期后,此键值。

2023-07-21 18:14:03 152

原创 【Redis】集群

由从节点提供读服务(即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到。哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的。:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,

2023-07-20 22:00:53 86

原创 【Redis】 事务

Redis 事务本质是一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行。所有的命令在事务中,并没有直接被执行。只有发起执行 exec 命令的时候才会执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。命令观测监听某个键的变化,如果在其他客户端将监听值修改,在事务中对某个键操作时,事务会失效。同一事物中多条命令执行的原子性,即使命令有错误也会添。加到队列中,执行报错也不影响其他命令执行。在事务开启前还可以通过。开启事务(multi)执行事务(exec)

2023-07-20 21:54:40 81

原创 【Redis】

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的,使用C 语言编写的,支持网络交互的内存中的 Key-Value数据结构存储系统,支持多种语言,它可以用作数据库缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)。Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

2023-07-17 22:00:15 124

原创 【MySQL】索引

索引是帮助MySQL快速获取数据的一种数据结构。特点:①排好序 ②快速左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址。为了加快 Col2 的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。

2023-07-16 14:36:53 78

原创 【MySQL】事务

事务隔离级别由高到低。隔离级别越高数据越安全,但是性能会越差。因此选择隔离级别的时候需要根据特定的场景选择。

2023-07-14 21:02:13 82

原创 【程序、进程、线程】的区别与联系(全网最全面最清晰)

程序是一组指令的集合,它描述了完成特定任务的步骤和操作。程序通常以源代码的形式编写,可以使用编程语言如C、Java、Python等来表示。程序本身是静态的,它只是存储在存储介质(如硬盘)上的一段代码。进程是计算机系统中正在运行的程序的实例。当一个程序被执行时,操作系统会为其创建一个独立的进程。线程是进程中的执行单元。一个进程可以包含多个线程,它们共享进程的内存空间和系统资源。线程是操作系统调度的基本单位,可以并发执行。

2023-07-13 19:32:17 1042

原创 【JVM】之垃圾回收器

CMS(Concurent Mark Sweep)收集器,是追求低停顿,与用户线程并发执行的收集器。是一款首创的与用户并发运行的收集器。垃圾回收过程初始标记: STW(时间较短),使用一条初始标记线程对GCRoots直接关联的所有对象进行标记。并发标记:与用户线程并发执行,此阶段进行可达性分析,标记处所有垃圾对象。重新标记:STW(时间较短),使用多条标记线程,将刚刚没有标记的垃圾对象全部标记出来。并发清除:只使用一条GC线程与用户线程并发执行,清理所标记出来的垃圾对象。此过程比较耗时。

2023-07-10 14:30:05 4940 1

原创 【内存管理】之内存空间的扩展

基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。虚拟内存有一下三个主要特征:多次性:无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。对换性。

2023-07-08 13:06:54 697 1

原创 【内存管理】之内存空间的分配与回收

操作系统作为资源的管理者,同时也要管理内存,将内存分配给各个进程;当进程运行结束后,回收进程的内存空间。

2023-07-07 21:42:27 1627 1

原创 【内存管理】

不管是电脑还是手机,平时下载的文件包括应用程序(各种APP)都是在手机的机身内存或者电脑的硬盘中(在机组中成为外存或辅存)存放着。而硬盘的特点是:造价低,读写速度慢。处理速度远远跟不上CPU,也就是说,从硬盘中加载了半天的数据,CPU立刻就处理完了。

2023-07-07 21:27:22 137 2

空空如也

空空如也

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

TA关注的人

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