自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于monitor

想象一下,你住在一个宿舍,这个宿舍有一个公共浴室,这个浴室相当于一个方法或者一个代码块。由于只有一个浴室,所以每次只能有一个人使用。如果有人正在使用,其他人就必须等待。这个浴室就像Java中的一个monitor,而每个想要使用浴室的人就像一个线程。在Java中,我们使用来声明一个方法或者一个代码块是“同步”的,就像我们制定一个规则,每个人在使用浴室之前都必须敲门询问是否可进。如果浴室空闲,那么这个人就可以进去,并且锁住门,这样其他人就不能进去。这个人就像一个线程获得了。

2024-05-29 18:58:11 310

原创 关于什么是线程安全以及实现线程安全的方案

在多个线程同时执行同一段代码或者操作同一个共享变量时,和多个线程排队串行执行的预期的结果一样,共享变量的值也和预期的一样,那就是线程安全。

2024-05-29 12:31:09 824

原创 一文讲透MySQL锁机制

数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。基本锁类型:锁包括行级锁和表级锁。

2024-05-28 23:52:38 1731

原创 ELK学习

滚动查询和原生查询,一个相当于我们翻书,可以跳,一个相当于长图,看到哪儿显示哪儿,这也是他们的异同点:滚动查询无论查多少数据都可以,但是不能翻页,不支持分页;ES为了避免深分页,不允许使用分页(from&size)查询10000条以后的数据,因此如果要查询第10000条以后的数据,要使用ES提供的 scroll(游标) 来查询。按size=10共分10页,那么当用户查询第n页的时候,实际上es是把前n页的数据全部找出来,再去除前n-1页最后得到需要的数据返回,查最后一页就相当于全扫描。

2024-05-28 22:42:59 905

原创 如何设计一个能够支持高并发的系统

例如,将共享资源拆分为多个独立的资源,每个请求只操作自己的资源,避免冲突。采用集群部署的模式,将一个服务通过集群进行部署,来提升系统整体的吞吐量及响应速度,并使用负载均衡技术将请求均衡分配给多个服务器,以提高系统的性能和可用性。当数据量巨大时,还可以进行分库分表,将大量的读写操作分散到多个数据库或表中,减轻单个数据库(表)的读写压力,从而提高系统的并发度和响应速度。还可以通过读写分离,主库主要负责写操作,从库则负责读操作,从而提高了系统的并发度和可扩展性,以及系统的可用性和容错能力。

2024-05-28 15:07:38 1545

原创 什么是用户态、内核态

此时,CPU会暂停当前进程的执行,保存当前进程的状态(包括程序计数器、寄存器、栈指针等)并切换到内核态执行相应的操作,操作完成后再将控制权切换回用户态,恢复进程的执行。操作系统内核是运行在特权模式下的,可以访问所有硬件资源和底层系统资源,而应用程序是运行在非特权模式下的,只能访问被授权的资源,不能直接操作硬件资源和底层系统资源,所以用户态切换到内核态是指一个进程从用户态切换到内核态,或者从内核态切换回用户态的过程。也就是说,为了保护系统的稳定性和安全性,操作系统将运行在不同的特权模式下,即内核态和用户态。

2024-05-27 12:33:17 810

原创 五种常见的IO模型

如果没有可读取的数据,recv会立即返回,并返回一个指示没有数据可用的状态,过一段时间再被调用。所谓同步,即recv函数在调用从内核缓冲区中复制数据到用户空间缓冲区时,该操作会立即执行,用户空间缓冲区必须在这个阶段接收到从内核空间复制来的数据报文,recv函数必须在这个阶段返回数据报文的长度。在IO复用模型中,调用recv之前会先调用select或poll,这两个系统调用都可以在内核准备好数据(网络数据已经到达内核了)时告知用户进程,内核空间的数据报文准备好了,这时候再调用recv时是一定有数据的。

2024-05-27 12:01:26 408

原创 操作系统IO的流程

网络驱动程序负责将数据从网卡的接收缓冲区复制到内核空间的网络缓冲区,即图一硬件指向内核空间的箭头发生的过程(注意,此时从网卡的接收缓冲区复制到内核空间的网络缓冲区的数据通常是用户所发出的请求,而不是用户所想要从磁盘中查询的数据)。正是由于上面的近千字的阶段,导致了磁盘中的数据被用户进程获取是需要时间的,是有一个过程的。当用户的客户端向服务器端发出了查数据的请求后,用户的请求数据先发送到了服务器的网卡的接收缓冲区中,即图一中的硬件(注意,这个过程会有延时,因为用户的报文可能是分批次发送过来的)。

2024-05-27 00:38:53 646

原创 各类缓存区别一次性说清

分布式缓存的优点是可以支持多个应用程序共享数据,提高系统的可伸缩性和可用性,但是它的管理和维护成本较高,需要考虑数据一致性和故障恢复等问题。因此,内核级别缓存是一种不同于分布式缓存、本地缓存和近端缓存的缓存机制,它在操作系统内核层面上工作,提供对常用数据的快速访问。本地缓存是指将数据存储在单个应用程序的内存中,它通常被用于提高应用程序的性能,减少对数据库等后端存储系统的请求次数。分布式缓存是指将数据存储在多个节点的内存中,这些节点可以在不同的服务器上,甚至在不同的地理位置上。

2024-05-25 23:54:23 330

原创 JAVA领域的两种线程

在JAVA领域中,线程有两种定义:操作系统线程和JAVA线程,它们在基本概念上是相似的,但具体的状态和状态转换可能会有所不同,这主要是因为Java是跨平台的,它的线程模型需要在所有支持的操作系统上保持一致。操作系统的线程是操作系统内核调度的最小执行单位,它是进程的一部分。进程是一个正在执行的程序实例,而线程是进程内的一个独立执行路径。操作系统的线程负责执行进程中的指令,进行计算和操作,同时也负责管理线程的上下文切换、同步和资源分配等。操作系统线程的创建、销毁和调度都由操作系统负责。

2024-05-25 18:21:46 494

原创 关于进程和线程的上下文

当进程切换后页表也要进行切换,页表切换后CPU中的TLB就失效了,失效导致映射的命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢。每个进程处于安全性的原因,不能直接操作物理内存,所以在运行时都有自己的虚拟内存地址空间,这个空间是由操作系统提供的,它包括了进程需要访问的所有内存地址。过多的线程并行执行会导致CPU资源的争抢,产生频繁的上下文的保存和加载导致CPU资源的浪费,常常表现为高并发执行时,接口响应速度延长。对于线程切换,第1步是不需要做的,第2步是进程和线程切换都要做的。

2024-05-25 18:14:56 440

原创 JVM中类的加载流程

类的加载机制分为如下三个阶段:加载,连接,初始化。其中连接又分为三个小阶段:验证,准备,解析。

2024-05-23 12:20:46 1654

原创 关于数据库事务

在同一个请求中包含一系列访问并操作数据库中的数据项的操作,这一系列操作要保证ACID四大特性,那么这个操作序列称为一个事务一个事务读取到了其他事务未提交的数据。

2024-05-23 00:53:16 568

原创 关于数据库索引

对于InnoDB:在InnoDB中,主键索引就是聚簇索引,而非主键索引,就是非聚簇索引,所以在InnoDB中:对于聚簇索引来说,他的非叶子节点上存储的是索引值,而它的叶子节点上存储的是整行记录。数据库中的每行记录中,除了保存了我们自己定义的一些字段以外,还有一些重要的db row id字段,其实他就是一个数据库帮我添加的隐藏主键,如果我们没有给这个表创建主键,会选择一个不为空的唯一索引来作为聚簇索引,但是如果没有合适的唯一索引,那么会以这个隐藏主键来创建聚簇索引。唯一索引要求索引的列值必须唯一,不能重复。

2024-05-23 00:47:55 461

原创 王炸!!!万字图文说透HashMap

比如说当前的容器容量是16,负载因子是0.75,16*0.75=12,也就是说,当容量达到了12的时候就会进行扩容操作。当负载因子是1.0的时候,也就意味着,只有当数组的8个值(这个图表示了8个)全部填充了,才会发生扩容。这就带来了很大的问题,因为 Hash 冲突时避免不了的。当负载因子是1.0的时候,意味着会出现大量的 Hash 的冲突,底层的红黑树变得异常复杂。对于查询效率极其不利。这种情况就是牺牲了时间来保证空间的利用率。因此一句话总结就是负载因子过大,虽然空间利用率上去了,但是时间效率降低了。

2024-05-20 23:45:35 659 1

原创 序列化/反序列化

在JAVA中,创建了一个对象之后,对象保存在JVM的堆内存中。只有在JVM运行的时候这些对象才存在,如果JVM停止运行,这些对象也会随之消失。若要解决这样的痛点,便可将对象持久化存储,这样便可在需要的时候将数据读出。JAVA的对象序列化功能便可帮助我们实现这种功能,即序列化是一种数据的持久化手段。对象序列化机制是JAVA内建的对象持久化方式。可通过对将对象的状态保存为,并可在有需要的时候将这个字节数组通过反序列化的方式转换为对象。对象序列化的方式可将JVM中的活动对象和字节数组(流)之间进行转换。

2024-05-20 18:07:31 263 1

原创 HashSet(Hash表)

存放的是哈希值。HashSet存放元素的顺序不是按照元素存入集合时的顺序,而是按照哈希值来进行存储。获得元素同样也是根据元素的哈希值去获取。

2024-05-20 04:30:36 397

原创 fail-fast机制

在Java集合框架中,fail-fast机制是指集合在遍历过程中,如果检测到集合被结构性地修改了(比如添加、删除元素),它会立即抛出ConcurrentModificationException异常。然而,fail-fast机制也有其局限性,它并不能保证在多线程环境中完全避免并发修改异常,因为fail-fast是尽力而为的策略,并不是绝对的保证。如果你在遍历过程中尝试添加或删除元素(改变列表的结构),ArrayList会立即意识到这个改变,并抛出异常,而不是允许你继续进行可能会导致不可预知后果的操作。

2024-05-20 01:07:30 333

原创 遍历的同时修改一个List的方式

在 foreach的同时修改集合,会触发fail-fast机制,这是因为List的foreach遍历内部使用了迭代器(Iterator),而迭代器设计中包含了一种称为fail-fast机制的错误检测机制。主要是因为List的索引在元素被移除时会发生变化,从List中移除一个元素时,该元素之后的所有元素都会向前移动一位,也就是它们的索引会减少1。Stream每次处理过后都会生成一个新的Stream,不存在并发问题,所以Stream的filter也可以修改list集合。5. 使用Stream的过滤方法。

2024-05-20 01:03:16 129

原创 一文总结ArrayList的特点

内部是基于大小可变的数组实现的,内部的元素通过get,set进行操作和访问。

2024-05-20 00:02:56 665 1

空空如也

空空如也

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

TA关注的人

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