自定义博客皮肤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)
  • 收藏
  • 关注

原创 Spring设计模式之单例模式

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在Spring框架中,单例模式是默认的Bean定义方式,意味着在Spring的IoC容器中,每个Bean都只有一个实例。单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在Spring框架中,单例模式是默认的Bean定义方式,通过使用注解或者在XML配置文件的配置方式,可以实现单例模式。单例模式具有资源独占、状态管理和性能优化等优点。

2024-02-02 18:00:49 806

原创 Spring设计模式之工厂方法

工厂方法是设计模式中的一种,用于创建对象,其核心思想是将对象的创建和使用分离,提供了一种更为灵活和可维护的代码组织方式。在Spring框架中,工厂方法模式被广泛使用,帮助我们更好地管理对象的创建和依赖关系。本文介绍了Spring设计模式中的工厂方法。工厂方法是设计模式中的一种,用于创建对象,其核心思想是将对象的创建和使用分离,提供了一种更为灵活和可维护的代码组织方式。在Spring框架中,工厂方法模式被广泛使用,帮助我们更好地管理对象的创建和依赖关系。

2024-02-02 17:54:38 745

原创 数据结构之B树和B+树

B树和B+树

2024-01-30 19:24:12 2376 8

原创 数据结构之Radix和Trie

Radix和Trie

2024-01-30 15:36:24 2103 7

原创 Spring设计模式之简单工厂模式

简单工厂模式是一种常见的软件设计模式,用于创建对象,而无需指定其具体类。在Spring框架中,简单工厂模式通常用于处理依赖注入,使得代码更加模块化和可维护。@Component@Autowired这里使用了@Component注解来标记工厂类,使其成为Spring的一个Bean。在工厂类中,我们通过注入一个Map来获取所有可用的UserService实现。通过工厂类的getUserService方法,我们可以根据名称获取对应的UserService实例。

2024-01-29 19:03:50 654

原创 代码迁移,合并双仓库

公司原有A服务,B服务等多个服务,现有以下问题,A服务为公共服务,多个服务均依赖于此,在新版本计划移除A服务,各个服务自己进行承接对应的接口迁移代码。以下是本篇文章正文内容,下面案例可供参考。

2024-01-29 18:48:10 1155 1

原创 缓存一致性协议实现原理

在计算机系统中,缓存是一种用于提高数据访问速度的技术。然而,当多个节点或进程需要共享和操作同一份数据时,就可能会出现数据不一致的问题。为了解决这个问题,缓存一致性协议被引入。本文将介绍缓存一致性协议的实现原理。缓存一致性协议是用于确保多个节点或进程之间的缓存数据保持一致性的协议。当多个节点或进程共享同一份数据时,如果每个节点或进程都维护自己的缓存副本,那么在数据更新时,就需要一种机制来确保所有节点或进程的缓存数据保持一致。缓存一致性协议是计算机系统中用于确保多个节点或进程之间的缓存数据保持一致性的重要技术。

2024-01-28 21:37:26 372

原创 volatile内存语义

例如,当一个线程修改了count的值后,其他线程可能仍然看到旧的值,因为它们可能缓存了该变量的副本。此外,volatile关键字还确保了内存屏障的插入,以确保指令的重排序不会影响到变量的可见性。这样,当一个线程修改了count的值后,其他线程能够立即看到更新后的值,并且由于内存屏障的插入,指令的重排序不会影响到变量的可见性。JMM属于语言级的内存模型,它确保在不同的编译器和不同的处理器平台之上,通过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证。

2024-01-28 21:02:05 355

原创 锁的内存语义

锁的内存语义

2024-01-28 20:45:27 373

原创 主内存与工作内存交互协议

八种原子操作,八种基本操作

2024-01-28 20:39:59 333

原创 Java内存模型的抽象结构:理解并发编程的关键

在多线程编程中,内存模型是一个核心概念,它决定了线程如何共享和访问数据。Java内存模型(JMM)是Java平台规范中定义的一组规则和协议,用于描述线程之间如何通过共享内存进行交互。本文将深入探讨Java内存模型的抽象结构,帮助读者更好地理解并发编程中的原子性、可见性和有序性。Java内存模型的抽象结构是理解并发编程的关键。通过主内存与本地内存的划分、内存屏障与操作类型的组合,以及原子性、可见性和有序性的保证,Java内存模型为Java程序提供了高效、安全的并发执行环境。

2024-01-28 20:32:44 788

原创 并发三大特性解析

并发编程中的三大特性:原子性、可见性和有序性。在多线程编程中,并发性是一个重要的概念,它允许程序在多个任务之间切换执行,以提高程序的效率和响应性。然而,并发编程也带来了许多挑战,其中最主要的挑战之一是保证多个线程之间的数据一致性和正确性。为了解决这个问题,我们需要理解并发编程中的三个重要特性:原子性、可见性和有序性。并发编程中的原子性、可见性和有序性是保证程序正确性的重要原则。在实际应用中,我们需要根据具体的需求和场景,选择合适的并发模型和同步机制,来保证这些原则的实现。

2024-01-28 20:19:02 1256

原创 剖析线程池ForkJoinPool

ForkJoinPool是Java并发包java.util.concurrent中的一部分,专门为支持ForkJoin框架而设计。ForkJoinPool的主要特点是其工作窃取(work-stealing)机制,该机制允许线程从其他线程队列中窃取任务来执行。通过以上对ForkJoinPool的深度剖析,我们可以看到它是一个强大且灵活的线程池,特别适用于处理可以分解为独立子任务的问题。然而,使用ForkJoinPool时也需要注意避免过度拆分任务和合理设置线程数量等问题。

2024-01-27 23:39:25 1057

原创 剖析线程池ThreadPoolExecutor

线程池是一种多线程处理形式,它能够有效地管理和控制线程的创建、执行和销毁,从而降低系统开销,提高资源利用率。在Java中,ThreadPoolExecutor是线程池最常用的实现类,广泛应用于服务器开发、大数据处理、并行计算等领域。ThreadPoolExecutor虽然提供了丰富的功能和灵活性,但在某些特定场景下可能无法满足所有需求。此时,可以通过继承或实现相关接口来扩展和自定义线程池的行为。例如,可以自定义任务队列的实现以支持优先级调度;或者通过扩展ThreadFactory接口来自定义线程的创建过程。

2024-01-27 23:18:26 941

原创 BlockingQueue深度分析

BlockingQueue是Java并发编程中一个非常重要的工具,它提供了一种线程安全的队列,可以在多线程环境中安全地存储和传输对象。BlockingQueue常用于生产者-消费者模型,生产者线程将对象放入队列,消费者线程从队列中取出对象进行处理。BlockingQueue是Java并发编程中一个非常重要的工具,它提供了一种线程安全的队列,可以在多线程环境中安全地存储和传输对象。使用BlockingQueue可以有效地解决生产者-消费者问题,实现线程池、任务调度等场景。

2024-01-23 10:10:50 934

原创 ConcurrentSkipListMap深度解析

ConcurrentSkipListMap 是一个 Java并发包(java.util.concurrent)中的类,它提供了一个线程安全的、跳跃列表(SkipList)实现的 Map。跳跃列表是一种数据结构,它通过维护多个有序链表来提供快速的查找、插入和删除操作。ConcurrentSkipListMap 的设计目标是提供接近于 O(1) 的平均时间复杂度,对于常见的操作如 get、put、remove 等。二、核心特性。

2024-01-23 09:48:29 1141 1

原创 ConcurrentHashMap深度分析

ConcurrentHashMap是Java并发编程中的重要工具,它通过分段锁机制实现了高并发性能,同时通过红黑树和动态调整等机制提高了查找和扩容性能。在使用ConcurrentHashMap时,我们需要注意其线程安全特性以及迭代器的弱一致性语义。正确地使用ConcurrentHashMap可以帮助我们在多线程环境下实现高效的数据处理。

2024-01-22 12:51:14 923

原创 CopyOnWriteArrayList深度分析

CopyOnWriteArrayList是一种适用于读多写少并发场景的线程安全数据结构。它通过写时复制的策略实现了高效的读操作和线程安全。然而,由于每次写操作都需要复制整个数组,导致写性能和内存占用都有较大的开销。在使用CopyOnWriteArrayList时,需要根据实际需求进行权衡和选择。

2024-01-22 11:17:18 1224

原创 StampLock:一种高效的并发锁机制

在多线程编程中,并发控制是确保数据一致性和避免冲突的关键。ReentrantReadWriteLock 是 Java 中的一个常用工具,它提供了读写锁的功能,使得多个线程可以同时读取共享资源,但在写入时则需要独占式的访问。然而,在某些情况下,ReentrantReadWriteLock 的性能可能并不理想。为了解决这个问题,Java 8 引入了一个新的并发工具 StampedLock。

2024-01-20 10:15:42 392

原创 ReentrantReadWriteLock:深入解析与最佳实践

在并发编程中,锁是用于控制多个线程对共享资源的访问的一种机制。读写锁是其中一种特殊的锁,它分为读锁和写锁两部分,允许多个线程同时获得读锁,而写锁是互斥锁,不允许多个线程同时获得。Java并发包提供了ReentrantReadWriteLock类作为读写锁的实现。本文将对ReentrantReadWriteLock进行详细分析,并探讨其最佳实践。ReentrantReadWriteLock是一种重要的并发工具,它可以提高多读少写的场景的并发性能。

2024-01-19 14:36:23 1124 1

原创 AQS独占锁之ReentrantLock详解

AbstractQueuedSynchronizer(简称AQS)是一个抽象同步框架,可以用来实现一个依赖状态的同步器。它通过一个内部类Sync继承AQS,将同步器所有调用都映射到Sync对应的方法,从而实现了阻塞等待队列、共享/独占、公平/非公平、可重入等行为。ReentrantLock是JDK中提供的一种基于AQS框架的应用实现,是线程并发访问的同步手段。它具备互斥和同步的功能,同一时刻只允许一个线程访问共享资源,线程之间通过协作实现同步。

2024-01-19 10:47:00 891

原创 限流算法之流量控制的平滑之道:滑动时间窗算法

滑动时间窗算法是一种动态调整的限流算法,通过维护一个时间窗口内的请求计数来实现限流。与固定窗口算法不同,滑动时间窗算法能够根据历史请求数据动态调整窗口大小,从而更好地适应突发流量的变化。滑动时间窗算法的核心思想是:在每个时间窗口内,记录到达的请求数量,当计数达到限制值时,拒绝后续请求;当窗口移动时,计数器清零并重新开始计数。

2024-01-18 17:14:11 477

原创 限流算法之固定窗口算法

固定窗口算法是一种常见的滑动窗口算法,用于处理数据流中的窗口操作。

2024-01-18 16:14:23 462

原创 并发安全问题:挑战与解决方案

并发安全问题是软件开发中必须面对的挑战。为了解决这些问题,我们需要了解并发安全问题的类型和原因,并采取适当的措施来解决这些问题。这些措施包括使用锁或其他同步机制、使用原子操作、使用信号量、条件变量等机制、对共享数据进行封装、测试和验证等。随着软件应用的不断发展,并发操作的需求将会不断增加。因此,并发安全问题将会越来越重要。未来,我们需要进一步研究并发安全问题的本质和解决方法,开发更加高效、可靠和可扩展的软件应用。

2024-01-17 15:43:32 2263 3

原创 系统架构的演变:从单体到微服务的旅程

随着信息技术的快速发展,系统架构也在不断演变。从早期的单体架构到现代的微服务架构,每一次的变革都带来了更高的灵活性和可扩展性。本文将通过图解和代码示例,详细介绍系统架构的演变过程,并探讨微服务架构的优势和适用性。从单体架构到微服务架构,系统架构的演变经历了多个阶段。每种架构都有其适用的场景和优缺点。随着业务规模的不断扩大和复杂度的增加,微服务架构已经成为了一种主流的选择。它通过将系统划分为一系列微小的服务,实现了独立开发、部署和扩展,提高了系统的可维护性和可扩展性。

2024-01-17 12:29:26 597

原创 原子操作:并发编程的守护者

并发编程的守护者在多线程或者并发编程中,我们经常需要处理一些共享资源,这时候就需要保证这些共享资源的操作是线程安全的。而原子操作就是一种能够保证线程安全的重要手段。本文将详细介绍原子操作的定义、重要性、实现原理以及应用场景。原子操作可以被视为一个不可分割的操作,也就是说,在执行过程中不会被其他线程打断。一旦开始,就会从头到尾执行完毕,中间不会有任何停顿。原子操作是并发编程中的重要概念,它能够保证多个操作在并发环境中的一致性,避免数据不一致的问题。

2024-01-16 19:08:18 485

原创 设计模式之多线程分工模式--- 生产-消费者模式

Worker Thread模式类比的是工厂里车间工人的工作模式。但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就是生产者 - 消费者模式。生产者 - 消费者模式的核心是一个任务队列,生产者线程生产任务,并将任务添加到任务队列中,而消费者线程从任务队列中获取任务并执行。消息队列(MQ)可以被看作是一种生产者-消费者模式的实现。MQ充当了一个中间件的角色,用于解耦消息的生产者和消费者,使它们能够异步地进行通信。

2024-01-16 18:28:51 1367

原创 Spring之BeanDefinition

和申明式事务、编程式事务类似,通过,@Bean,@Component等申明式方式所定义的Bean,最终都会被Spring解析为对应的BeanDefinition对象,并放入Spring容器中。// 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中。BeanDefinition表示Bean定义,BeanDefinition中存在很多属性用来描述一个Bean的特点。这些,我们可以称之申明式定义Bean。

2024-01-15 16:44:06 884 2

原创 设计模式之多线程分工模式---Worker Thread模式

Worker Thread 模式需要注意死锁问题,提交的任务之间不要有依赖性。Worker Thread模式适用于需要并发处理多个任务提高系统吞吐量和效率的场景。通过合理地使用工作线程来处理任务,可以提高系统的并发性能和响应速度。

2024-01-15 14:32:34 1642 5

原创 设计模式之多线程分工模式--- Thread-Per-Message模式

Thread-Per-Message 模式需要注意线程的创建,销毁以及是否会导致OOM。Thread-Per-Message 模式—简单实用的分工方法Thread-Per-Message 模式就是为每个任务分配一个独立的线程,这是一种最简单的分工方法。Thread-Per-Message 模式作为一种最简单的分工方案,Java 中使用会存在性能缺陷。在Java中的线程是一个重量级的对象,创建成本很高,第一点创建线程比较耗时,第二点线程占用的内存也比大。所以为每个请求创建一个新的线程并。

2024-01-15 11:14:28 507

原创 Centos7安装K8S

Centos7安装K8S先上正确的,再说过程这是官网写的:ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl 安装cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes

2024-01-13 17:09:38 3488 2

原创 设计模式之多线程版本的if------Balking模式

Balking是“退缩不前”的意思。如果现在不适合执行这个操作,或者没必要执行这个操作,就停止处理,直接返回。当流程的执行顺序依赖于某个共享变量的场景,可以归纳为多线程if模式。Balking模式常用于一个线程发现另一个线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。Balking模式是一种多个线程执行同一操作时可以考虑的模式;在线程2被阻塞或者执行其他操作时,线程1同样可以完成操作,而当线程2执行或者继续执行。

2024-01-13 16:21:30 1371 1

原创 设计模式之多线程版本的if------Guarded Suspension模式

在多线程开发中,常常为了提高应用程序的并发性,会将一个任务分解为多个子任务交给多个线程并行执行,而多个线程之间相互协作时,仍然会存在一个线程需要等待另外的线程完成后继续下一步操作。而Guarded Suspension模式可以帮助我们解决上述的等待问题。Guarded Suspension 模式是通过让线程等待来保护实例的安全性,即守护-挂起模式,也常被称作 Guarded Wait 模式、Spin Lock 模式(因为使用了 while 循环去等待),它还有一个更形象的非官方名字:多线程版本的 if。

2024-01-13 15:49:47 908 1

原创 设计模式之避免共享的设计模式 Thread-Specific Storage 模式

Thread-Specific Storage 模式

2024-01-12 17:49:18 594

原创 设计模式之避免共享的设计模式Copy-on-Write模式

不变性对象在创建后就不再修改,而是返回新的对象来代表修改后的状态。在这种场景下,COW可以用于处理返回新对象时的内部数据复制,确保并发访问的安全性。配置信息:在配置信息读取频繁,而修改操作较少时,可以使用COW来管理配置信息。当需要修改配置时,创建配置的副本进行修改,然后替换原始配置,确保读取配置信息的线程不会受到修改操作的干扰。缓存:在缓存对象上应用COW可以确保读操作始终访问到数据的一致性版本,而不受到写操作的影响。在数据变化时,先复制原始数据,然后对副本进行写操作,以确保数据备份的一致性。

2024-01-12 12:20:02 608

原创 设计模式之避免共享的设计模式Immutability(不变性)模式

Immutability模式

2024-01-11 16:02:36 617

原创 设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式

Two-phase Termination(两阶段终止)模式

2024-01-11 15:10:17 1036

原创 数据结构之红黑树

红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或者BLACK。通过对任何一条从根到叶子的路径上各个着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。当二叉查找树的高度较低时,这些操作执行的比较快,但是当树的高度较高时,这些操作的性能可能不比用链表好。红黑树(red-black tree)是一种平衡的二叉查找树,它能保证在最坏情况下,基本的动态操作集合运行时间为O(lgn)。

2024-01-10 14:51:56 615 1

原创 数据结构之二叉搜索树(Binary Search Tree)

二叉搜索树

2024-01-09 16:01:38 526

原创 并发之CAS原子操作的三大问题

然后在接下来的阶段,A对B的态度发生了改变,变得很疏远(b阶段)。因为CAS需要在操作值的时候,检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁。在变量前面追加上版本号,每次变量更新的时候把版本号加1,那么A→B→A就会变成1A→2B→3A。

2024-01-06 16:59:56 580

空空如也

空空如也

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

TA关注的人

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