- 博客(80)
- 资源 (1)
- 收藏
- 关注
原创 Java 中的 Flux 类
这段代码首先创建了一个包含数字1到5的Flux,然后将每个元素转换为字符串,接着过滤出偶数,每发出一个元素就立即打印出来,并为每个元素设置了100毫秒的延迟。最后订阅了这个Flux,使得处理流程得以启动。类是 Reactive Streams 规范在 Reactor 库中的实现,用于处理包含零个、一个或多个元素的异步序列。是一种响应式流类型,适用于处理连续的数据流,例如网络请求、数据库查询结果集、事件流等。
2024-03-28 15:06:32 271
原创 Java中的Mono类
类是Spring Reactor框架中的一个核心组件,它是Reactive Streams规范的一个实现,主要用于处理包含零个或一个元素的异步序列。Mono可以代表未来某个时刻可能出现的单一值,或者表示没有值(即空值)。这种类型的反应式类型非常适合那些你期望返回单个结果(比如查询数据库得到的单个实体)的情况。注意:由于Mono是冷信号(Cold Signal),直到订阅发生时才会执行相关逻辑。因此,它的优势在于能够构建灵活且高效的异步处理管线。
2024-03-28 15:05:37 481
原创 浏览器如何渲染页面
如果JavaScript修改了DOM结构或CSS样式,或者有其他交互导致页面变化,浏览器会重新执行部分或全部上述步骤(如布局、绘制等)以反映新的状态。浏览器将DOM树与CSSOM树结合,形成渲染树(Render Tree),它包含了每个可见节点的样式信息。通过这个例子可以看出,浏览器渲染页面是一个有序且相互关联的过程,涉及网络通信、文档解析、样式计算、布局以及最终的图形绘制等多个环节。属性,浏览器将在文档解析完成后,DOMContentLoaded事件触发前,执行JavaScript代码(在此例中为。
2024-03-26 15:35:56 279
原创 浏览器事件循环原理
由于setTimeout的延时时间为0,虽然它已经注册,但在实际应用中,至少要等到本次事件循环的微任务队列执行完毕后才会执行(实际延时通常大于0,这里是理想化表述)。5. 一旦宏任务执行完毕,主线程再次空闲,继续检查微任务队列,若有微任务则继续执行,否则继续等待新的宏任务到来,如此循环往复。- 创建一个Promise,并在其内部立即执行同步代码块,打印'2. 同步代码块内的微任务'- 清理并执行微任务队列中的所有微任务。- 执行宏任务队列中的下一个宏任务。- 执行微任务'4. 微任务'
2024-03-26 15:31:27 165
原创 JAVA中CAS原理
在Java中,CAS(Compare-and-Swap)是一种无锁算法,通过JNI(Java Native Interface)调用本地方法来利用处理器提供的原子指令实现。这意味着即使在高并发环境下,多个线程同时尝试更新同一变量时,只有一个线程能成功完成更新,其余线程将继续循环尝试直至成功,从而确保了在无锁的情况下也能实现并发控制和数据一致性。方法接受两个参数:当前预期的值和新的值。这个方法尝试将原子整数的值从预期的当前值更新为新值,如果当前原子整数的实际值与预期值相匹配,则更新,并返回。
2024-03-25 09:09:34 444
原创 进程通信(生成者-消费者)
同步块或方法中使用,因为它们依赖于对象的监视器(monitor),只有持有对象监视器的线程才能调用这些方法。下面是一个简单的例子,展示如何在一个生产者消费者模型中使用。方法的配合使用,实现了生产者和消费者线程之间的同步和通信。是用于线程间协作和同步的重要方法,它们都定义在。
2024-03-25 09:06:19 418
原创 线程间通信
在这个例子中,有两个线程分别扮演生产者和消费者的角色,共享一个资源。的代码逐步执行,但是如果每个线程间都孤立地运行,就会造资源浪。务,那么这些线程之间就需要互相协调,这个过程被称为线程的通信。线程是操作系统调度的最小单位,有自己的栈空间,可以按照既定。线程的通信可以被定义为:当多个线程共同操作共享的资源时,线。程间通过某种方式互相告知自己的状态,以避免无效的资源争夺。方法是线程间通信和同步的核心机制,它们位于。方法,它会唤醒所有等待在该对象上的线程。方式的线程间通信使用对象的。通知、共享内存、管道。
2024-03-24 12:52:55 324
原创 无锁、偏向锁、轻量级锁和重量级锁
状态、偏向锁状态、轻量级锁状态和重量级锁状态,这些状态随着竞争。内置锁可以升级但不能降级,意味着偏向锁升级成轻量。自动获取锁,降低获取锁的代价。线程来竞争锁时,先用偏向锁,表示内置锁偏爱这个线程,这个线程要。偏向(独占)锁了,锁会升级为轻量级锁,两个线程公平竞争,哪个线。版本为了减少获得锁和释放锁所带来的性能消耗,引入了偏向锁和。偏向锁是指一段同步代码一直被同一个线程所访问,那么该线程会。当有两个线程开始竞争这个锁对象时,情况就发生变化了,不再是。重量级锁会让其他申请的线程之间进入阻塞,性能降低。
2024-03-24 12:36:53 404
原创 JOL工具查看java对象布局
JOL(Java Object Layout)是一个用于分析Java对象在Java虚拟机(JVM)中内存布局的小工具包。另外,JOL也提供了一个命令行工具,可以直接通过命令行参数传入类名查看其内存布局,但这种方式可能需要额外配置并直接运行JOL项目的相关类。请注意,实际使用的JOL版本号可能会有变化,应当查阅最新的JOL文档或Maven仓库确定正确的版本号。类的对象在内存中的布局信息,包括对象头、实例变量、对齐填充等内容。首先,在Maven项目中引入JOL工具的依赖,将以下内容添加到。
2024-03-23 14:34:32 111
原创 java对象结构
组,那么此字段必须有,用于记录数组长度的数据;对象体包含对象的实例变量(成员变量),用于成员属性值,包括。对象的地址,虚拟机通过这个指针来确定这个对象是哪个类的实。数组,那么此字段不存在,所以这是一个可选字段。实例)结构包括三部分:对象头、对象体和对齐。对齐字节也叫作填充对齐,其作用是用来保证。对象头包括三个字段,第一个字段叫作。(类对象指针),用于存放方法区。的内存管理要求对象起始地址必须是。的倍数,当对象的实例变量数据不是。于存储自身运行时的数据,例如。时,便需要填充数据来保证。
2024-03-23 14:30:21 103
原创 桥接模式简介
在Java中,桥接模式(Bridge Pattern)的核心思想是将抽象部分与其实现部分分离,使其可以独立变化。以下是桥接模式的一个简单示例,我们将创建一个图形渲染系统,该系统允许用户选择不同的形状(抽象部分)和不同的颜色策略(实现部分)。这样,我们就可以独立地修改图形种类或颜色策略,而不影响彼此的实现细节。这就是桥接模式的应用。是抽象部分,它定义了所有图形共有的行为(绘制),但是不关心如何绘制颜色。是抽象部分的具体实现,它们都依赖于。则是实现部分的抽象接口,接口来决定颜色策略。
2024-03-22 16:33:20 999
原创 单例模式的实现方式
方法时才进行实例化,为了解决线程安全问题,懒汉式单例可以通过同步方法或双重检查锁定机制来确保多线程环境下的安全性。其中,双重检查锁定(DCL)是常用的优化手段,它既保证了线程安全,也避免了每次都进行同步操作带来的性能损耗。在上述代码中,饿汉式单例在类被加载时就完成了实例化,所以它是线程安全的;而懒汉式单例则是在第一次调用。
2024-03-22 16:22:31 602
原创 数据库的分类,特征和介绍
每种类型的数据库都有其独特的优缺点和适用场景,选择哪种数据库取决于项目需求、数据结构的复杂性、可扩展性要求、性能需求等因素。
2024-03-21 13:45:19 332
原创 mysql 索引 B+tree
注意,内存中的页并不直接反映磁盘上的物理布局,而是经过了数据库系统的逻辑组织和管理,确保了即使在不同的硬件环境下,也能保持高效的读写性能。时,MySQL 会从内存缓存池(Buffer Pool)中查找对应的 B+Tree 索引页,如果不在缓存中则从磁盘读取。从根节点开始,沿着键值比较的路径向下遍历,最终到达存储该。内存中加载了一个 B+Tree 的索引页,这个页包含了多个槽(slot),每个槽包括键值(如。的叶子节点,叶子节点中找到对应的记录指针,再通过该指针获取完整的数据行。
2024-03-21 13:37:21 822
原创 Redis单线程实现高并发原理
不过,在一些极端场景下,比如涉及到大量计算的任务或者大量阻塞式操作时,单线程架构可能会成为性能瓶颈,但Redis通过精简设计和针对性优化,依然在多数实际应用中表现出良好的并发性能。: Redis 主线程开始处理事件,即读取客户端发来的命令请求。: Redis 通过使用操作系统提供的 I/O 多路复用机制,如 Linux 中的 epoll、BSD 系统的 kqueue,或者是旧版本中使用的 select 和 poll 等 API,可以在单一线程中同时监控多个客户端 socket 的读写事件。
2024-03-20 11:17:46 1048
原创 高并发IO底层原理浅析(九)
在Netty中,Channel 和 ChannelPipeline 是两个核心组件,用于处理网络通信的各个环节,如连接管理、数据读写、编解码、业务逻辑处理等。下面我将详细解释这两个组件的设计原理以及如何使用它们。
2024-03-19 16:38:12 834
原创 高并发IO底层原理浅析(八)
在Netty中,EventLoopGroup 是一个核心组件,它负责处理和调度网络事件。它是 Netty 的异步I/O模型的基础,实现了多路复用器(Selector)与线程池的结合,以高效地处理连接、读写等网络事件。这节我们详细研究一下 netty ,我们先看 netty中的EventLoopGroup组件。
2024-03-18 12:14:14 544
原创 Java里的callable的实现原理
在Java并发编程中,Runnable、Callable、Future、RunnableFuture 和 FutureTask 这些接口和类都是为了支持异步任务执行和结果获取而设计的。下面分别说明它们的设计原理并提供使用范例。RunnableFuture 同时继承了 Runnable 和 Future 接口,这意味着它是一个可运行的任务,同时也能作为 Future 来获取结果。Runnable 是 Java 中最基本的线程任务接口,它只包含一个 run() 方法,用于定义线程需要执行的任务。
2024-03-18 12:00:53 367
原创 高并发IO底层原理浅析(六)
Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
2024-03-14 09:51:12 782
原创 python中的排序(二)
list.sort() 和 sorted() 接受布尔值的 reverse 参数。注意 blue 的两个记录如何保留它们的原始顺序,以便 (‘blue’, 1) 保证在 (‘blue’, 2) 之前。上面显示的键函数模式非常常见,因此 Python 提供了便利功能,使访问器功能更容易,更快捷。这个美妙的属性允许你在一系列排序步骤中构建复杂的排序。模块有 itemgetter() 、attrgetter() 和 methodcaller() 函数。这意味着当多个记录具有相同的键值时,将保留其原始顺序。
2024-03-07 09:49:30 574 1
原创 python中的排序(一)
list.sort() 和 sorted() 都有一个 key 形参来指定在进行比较之前要在每个列表元素上进行调用的函。另外一个区别是,list.sort() 方法只是为列表定义的,而 sorted() 函数可以接受任何可迭代对象。你也可以使用 list.sort() 方法,它会直接修改原列表(并返回 None 以避免混淆),通常来说它不如。key 形参的值应该是一个函数,它接受一个参数并并返回一个用于排序的键。它会返回一个新的已排序列表。sorted() 方便———但如果你不需要原列表,它会更有效率。
2024-03-07 09:37:49 419
原创 高并发IO底层原理浅析(五)
Reactor模式常用于高性能网络服务器的设计中,它可以有效地提高系统资源利用率,降低延迟,提高吞吐量。例如,在Java NIO库中,Selector就是Reactor模式的一个典型应用实例;而在Node.js中,其事件循环机制也体现了Reactor模式的思想。Reactor模式是一种事件驱动设计模式,主要用于处理高并发的I/O操作。它在操作系统级别利用非阻塞I/O和事件多路复用技术来同步地监听和分发多个客户端请求到相应的处理器上。
2024-03-05 09:58:22 632
原创 Redis使用实战经验(一)
由于Redis内存在管理上的复杂性,尤其是对于压缩编码和共享对象池等因素的存在,直接通过命令得到的结果是最准确的。分析访问模式和数据增长趋势,调整数据库配置和架构,比如是否采用集群部署、分片技术来分散负载和存储压力。
2024-03-05 09:35:32 981
原创 高并发IO底层原理浅析(四)
在单个线程中,Selector可以监听和管理多个Channel上的事件,这样就极大地提高了服务器端处理大量并发连接的效率。原理: Selector基于操作系统提供的I/O复用API实现,例如Linux下的epoll或Windows下的IOCP等,它可以同时监控多个Channel,当任何一个Channel上有新的可读、可写或有连接建立等事件发生时,Selector会将这些事件通知给应用程序。注意,实际应用中可能还需要考虑异常处理、数据完整性和线程安全等问题。
2024-03-04 09:29:51 420
原创 高并发IO底层原理浅析(三)
在Java NIO中,Buffer(缓冲区)是核心组件之一,用于存储不同类型的数据,如字节、字符、短整型、整型、长整型和浮点数等。其中,最常用的可能是ByteBuffer,因为它可以处理原始的字节数据,适合于网络和文件I/O操作。此外,NIO Buffer还提供了许多其他的方法,例如rewind()用于重新读取缓冲区内容,slice()用于创建现有缓冲区的部分视图,以及各种get()和put()的变体方法用于处理不同数据类型等。
2024-03-04 09:23:25 411
原创 高并发IO底层原理浅析(二)
在Java NIO中,Channel是用于进行数据读写的基础组件,它是连接到能够执行I/O操作的实体(如文件、套接字)的对象。Channel类似于传统IO中的InputStream和OutputStream,但与之不同的是,Channel是双向的,可以同时用于读取和写出数据,并且通常配合Buffer对象使用以提高效率。以上示例展示了如何创建并使用不同类型的Channel进行I/O操作,实际场景中往往还会结合Selector来进行高效的多路复用,从而在一个单线程中处理多个Channel上的事件。
2024-03-03 10:48:59 443
原创 高并发IO底层原理浅析(一)
高并发IO的底层原理主要涉及操作系统如何处理大量并发的输入输出请求,以及Java NIO(New IO)框架是如何在Java层面利用这些机制来提高性能和并发能力的。
2024-03-03 10:27:02 409
原创 java中的synchronized(Biased Locking,Lightweight Locking,Heavyweight Locking)
当一个线程进入synchronized方法或代码块时,会尝试获取对象的锁,如果获取成功,则可以执行同步代码;轻量级锁(Lightweight Locking):如果第一个获取锁的线程不再持有锁,那么这个锁就会升级为轻量级锁。如果CAS操作失败,会升级为重量级锁。偏向锁(Biased Locking):当一个线程获取一个对象的锁时,会将这个线程记录下来,并在对象头中的Mark Word中标记为偏向锁。重量级锁(Heavyweight Locking):如果获取锁的线程不断变化,那么锁将升级为重量级锁。
2024-03-02 09:42:50 472
原创 雪花算法简单实现
Snowflake算法是一种分布式系统生成全局唯一ID的算法,主要用于在分布式系统中生成唯一ID,以防止因为多台服务器同时生成ID而产生重复的情况。其主要原理是根据时间戳、数据中心ID和机器ID等信息生成一个64位的唯一ID。
2024-03-02 09:28:43 323
原创 python中的dict类型
... 其他类似的方法,例如 `keys()`, `values()`, `clear()`, 等等 ...# 使用自定义字典类print(my_dict["a"]) # 输出:1print(my_dict.get("c")) # 输出:3。
2024-03-01 09:55:49 402
原创 python中的迭代器的使用
在Python中,迭代器(Iterator)是一个特殊对象,它实现了迭代协议,允许程序员遍历集合元素而无需暴露其底层表示。例如,列表、元组、字符串、字典、集合以及自定义类(如果它们实现了迭代器协议)都是可迭代的。每次对__next__()方法的调用都会返回下一个数,并且当达到或超过max_value时,会触发StopIteration异常,这标志着迭代的结束。下面,我们实现一下自己的迭代器,该类需要实现__iter__()和__next__()两个特殊方法(魔法方法),以遵循Python的迭代器协议。
2024-03-01 09:28:07 526
原创 python3中使用共享内存
在Python3中,共享内存主要用于多进程间高效的数据共享。Python标准库中的multiprocessing模块提供了两种方式实现共享内存:Value和Array,它们允许不同进程访问同一块内存区域。注意,直接使用shared_memory模块时,通常需要自己处理数据类型转换和同步问题。
2024-02-29 09:28:51 416
原创 python中的queue
在Python3中,队列是一种非常重要的数据结构,尤其在多线程和多进程编程中,用于实现生产者消费者模式等并发场景。下面通过一个简单的例子来展示如何在Python3中使用queue模块创建和操作队列。这样就演示了如何在Python3中利用队列进行线程间的同步与通信。
2024-02-29 09:05:48 421
原创 python中信号量(Semaphore)
在Python中,信号量(Semaphore)主要用来控制多个线程或进程对共享资源的访问。信号量本质上是一种计数器,它维护一个许可(permit)数量,每次 acquire() 函数被调用时,如果还有剩余的许可,则减少一个,并允许执行;如果没有剩余许可,则阻塞当前线程直到其他线程释放信号量。在这个例子中,我们创建了一个最多允许3个线程同时执行的信号量。当超过3个线程尝试进入临界区时,其余线程将等待信号量被释放。每个成功获取信号量的线程在完成其工作后会释放信号量,以便其他等待的线程能够继续执行。
2024-02-28 16:45:54 398
原创 scss声明全局变量
通常的做法是在单独的文件中定义这些全局变量,然后通过@import规则将其导入到需要使用这些变量的地方。2.导入全局变量文件: 在项目的主入口样式文件(比如 main.scss 或者根据Vite或VueCLI配置的入口文件)中,通过 @import 导入这个全局变量文件。1.创建一个全局变量文件: 例如,创建一个名为 _variables.scss 的文件,并在这个文件中定义你的全局变量。这样一来,你在整个项目中定义的任何SCSS文件只要包含了对主入口文件的引用,就可以直接使用这些全局变量。
2024-02-28 12:03:56 749
原创 python中线程同步机制 lock
当多个线程尝试访问共享资源(这里是变量shared_resource)时,每个线程都会先调用lock.acquire()来获取锁。在try/finally块中确保无论发生什么情况,最后都会通过lock.release()释放锁,以保证其他线程能够继续访问共享资源。在这个例子中,生产者通过not_full条件变量等待队列不满,然后添加产品到队列,并唤醒等待的消费者。消费者则通过not_empty条件变量等待队列非空,然后从队列中取出并消费产品,并唤醒等待的生产者。
2024-02-27 08:55:13 918
原创 Python中Thread 类使用说明
然而,在实际应用中,需要注意由于全局解释器锁(GIL)的存在,Python的多线程并不能充分利用多核CPU的优势进行计算密集型任务的并行处理,但对于IO密集型任务或频繁切换的任务来说,多线程仍然可以提升程序性能。同时,在多线程环境下,需要考虑线程安全问题,可能需要使用线程同步机制如锁(Lock)、条件变量(Condition)、信号量(Semaphore)等来保护共享资源的访问。在Python中,threading.Thread 类是用于创建和管理线程的核心类。
2024-02-27 08:50:15 360
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人