- 博客(29)
- 收藏
- 关注
原创 RabbitMQ客户端应用开发实战
这一章节是与开发人员联系最紧密的部分,因此也是必须要掌握的重点,尤其是基础的编程模型。各种不同的业务场景其实都是将这些步骤在不同业务场景中落地。对于这么多看起来差不多的API,首先,你一定需要自己动手敲敲这些代码,熟悉起来。熟悉之后,你一定要开始代入到一些业务场景当中,开始逐步去理解RabbitMQ各种机制的特点。针对各种不同的实际问题,尝试去理解RabbitMQ逐步解决这些问题的思路。例如面试中经常被问到的如何保证消息不丢失的问题,RabbitMQ是如何处理的,你有想法了吗?不妨尝试做一下梳理。
2024-11-04 17:32:02
1244
原创 RabbitMQ快速上手以及核心概念详解
RabbitMQ的历史可以追随到2005年,他是一个非常老牌的MQ产品,使用非常广泛。同时期的很多MQ产品都已经逐渐被业界淘汰了,比如2003年诞生的ActiveMQ,2012年诞生的ZeroMQ,但是RabbitMQ却依然稳稳占据一席之地,足可见他的经典。官网地址 https://www.rabbitmq.com/。目前最新的官网是这样介绍的:最新的3.13版本官网做了一次大改版,由此可见RabbitMQ产品的开发活力依然非常强劲。通过这些操作,我们就可以了解到RabbitMQ的消息流转模型。
2024-11-04 15:57:42
664
原创 17、CPU缓存架构详解&高性能内存队列Disruptor实战
Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apache Storm、Camel、Log4j2在内的很多知名项目都应用了Disruptor以获取高性能。
2024-09-26 11:19:18
1339
原创 14、线程池ForkJoinPool实战及其工作原理分析
*归并排序(Merge Sort)是一种基于分治思想的排序算法。**归并排序的基本思想是将一个大数组分成两个相等大小的子数组,对每个子数组分别进行排序,然后将两个子数组合并成一个有序的大数组。因为常常使用递归实现(由先拆分后合并的性质决定的),所以我们称其为归并排序。将数组分成两个子数组对每个子数组进行排序合并两个有序的子数组归并排序的时间复杂度为O(nlogn),空间复杂度为O(n),其中n为数组的长度。
2024-09-25 14:01:48
1095
原创 13、线程池ThreadPoolExecutor实战及其原理分析
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如Tomcat。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。:任务到达时,无需等待线程创建即可立即执行。
2024-09-25 09:35:04
1004
原创 阻塞队列BlockingQueue实战及其原理分析
PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,虽然指定了数组的长度,但是可以无限的扩充,直到资源消耗尽为止,每次出队都返回优先级别最高的或者最低的元素。和它不同的是,LinkedBlockingQueue 的内部是用链表实现的,所以这里就需要我们考虑到,ArrayBlockingQueue 没有链表所需要的“节点”,空间利用率更高。线程池中的工作线程从任务队列中取出任务进行处理,如果队列为空,则工作线程会被阻塞,直到队列中有新的任务被提交。
2024-09-25 09:34:48
1010
原创 并发容器(Map、List、Set)实战及其原理分析
Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。所以,Java先提供了同步容器供用户使用。同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector、Hashtable以及SynchronizedList等容器。这样做的代价是削弱了并发性,当多个线程共同竞争容器级的锁时,吞吐量就会降低。因此为了解决同步容器的性能问题,所以才有了并发容器。
2024-09-19 13:59:07
1142
原创 Semaphore&CountDownlatch&CyclicBarrier源码分析
CountDownLatch让一个或多个线程等待其他线程执行完成后再执行。在创建CountDownLatch对象时,必须指定线程数count,每当一个线程执行完成调用countDown()方法,线程数count减1,当count减到0时,await()方法就不再阻塞。
2024-09-18 11:36:40
909
原创 深入理解AQS之独占锁ReentrantLock源码分析
java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于**AbstractQueuedSynchronizer(简称AQS)**实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的- 一般是通过一个内部类Sync继承 AQS- 将同步器所有调用都映射到Sync对应的方法阻塞等待队列。
2024-09-13 13:47:44
802
原创 【JUC并发同步工具类在大厂中应用实战】
ReentrantLock的应用场景主要体现在多线程环境下对共享资源的独占式访问,以保证数据的一致性和安全性。ReentrantLock具体应用场景如下:1.解决多线程竞争资源的问题,例如多个线程同时对同一个数据库进行写操作,可以使用ReentrantLock保证每次只有一个线程能够写入。2.实现多线程任务的顺序执行,例如在一个线程执行完某个任务后,再让另一个线程执行任务。3.实现多线程等待/通知机制,例如在某个线程执行完某个任务后,通知其他线程继续执行任务。
2024-09-13 09:16:42
945
原创 【并发锁机制之深入理解synchronized】
思考: 两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?
2024-09-11 10:48:10
716
原创 【3、导致JVM内存泄露的ThreadLocal详解】
1.线程安全: 在多线程并发的场景下保证线程安全2.传递数据: 我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量3.线程隔离: 每个线程的变量都是独立的,不会互相影响在使用之前,我们先来认识几个ThreadLocal的常用方法从结果可以看出多个线程在访问同一个变量的时候出现的异常,线程间的数据没有隔离。下面我们来看下采用 ThreadLocal 的方式来解决这个问题的例子。从结果来看,这样很好的解决了多线程之间数据隔离的问题,十分方便。
2024-09-10 09:02:45
1016
原创 2.Future&CompletableFuture
直接继承Thread或者实现Runnable接口都可以创建线程,但是这两种方法都有一个问题就是:没有返回值,也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景,而Future和FutureTask就可以和Callable接口配合起来使用。
2024-09-06 09:32:14
1063
1
原创 认证和授权
认证 就是系统对用户信息的确认,常见的有用户名密码登录 二维码 指纹 面容 等。授权 就是对用户行为的控制,常见的模型有 用户 - > 角色 -> 应用。
2024-05-21 14:56:38
144
1
原创 【NIO的核心组件】
channel 类似流 每一个channel 对应一个buffer缓存区。channel 会注册到selector。selector 收到channel消息交给闲散线程处理 select 对应一个或多个线程。NIO 的核心组件有Buffer channel Selector。Buffer 和 channel 双向的 可读可写。
2024-05-21 14:38:58
145
1
原创 select,poll和epoll有什么区别
java的NIO 在windows下 WindowsSelectorProvider,Linux下,根据linux的内核版本,2.6版本以上,就是EPollSelectProvider,否则就是默认的PollSelectProvider,poll 机制:和select机制是差不多的,把fd_set结构进行了优化,FD集合的大小就突破了操作系统的限制。将fd_set从用户空间复制到内核空间,激活socket。用户空间和内核空间:操作系统为了保护系统安全,将内核划分为两个部分,一个是用户空间,一个是内核空间。
2024-05-20 16:30:19
181
1
原创 一般项目如何排查JVM问题
5.首先,初步猜测频繁fullgc的原因,如果频繁发生fullgc但是有没有出现内存溢出,那么表示fullgc实际上是回收了很多对象了,所以这些对象最好能在younggc过程直接回收掉,避免这些对象进入老年代,对于这种情况,就要考虑这些存活时间不长的对象是不是比较大,导致年轻代放不下,直接进入老年代,尝试加大年轻代大小,如果改完之后,fullgc减少,则证明修改有效。6.同时,还可以找到占用CPU最多的线程,定位具体方法,优化这个方法的执行,看看是否能避免某些对象的创建,从而节省内存。
2024-05-20 10:14:36
240
原创 【java类加载】
BootStarpClassLoader 默认负责加载%JAVA_HOME%lib下的jar包和class文件。ExtClassLoader 负责加载%JAVA_HOME%lib/ext下的jar包和class文件。AppClassLoader 是自定义加载器的父类,负责加载classpath下的类文件。加载 把Java的字节码数据加载到jvm内存中,并映射成jvm认可的数据结构。沙箱保护机制也是对Java底层基础类进行保护,不能以某些包名命名。类加载过程 加载>连接>初始化。
2024-05-18 20:27:36
343
原创 【gc 如何判断对象可以被回收】
可达性算法中的不可达对象并不是立即死亡的,而是对象拥有一次自我拯救的机会,对象被系统宣告死亡至少要经历两次标记过程:第一次是经历可达性分析发现没有与GC roots相连接的引用,第二次是在由虚拟机自动建立的Finalizer队列中判断是否需要执行finalize方法。当一个对到GC roots 没有任何引用链,则证明对象是不可用的,那么虚拟机就会判断是可回收对象。每个对象有一个引用计数属性,新增一个引用时计数器+1,引用释放时计数器-1,计数为零时可以被回收。有循环引用的问题,Java没有使用这种方法。
2024-05-16 15:58:27
267
原创 == 与 equals 区别
Java 分为基本数据类型和引用数据类,基本数据类型的值存在栈中,引用数据类型的值存在堆中, == 号比较的是栈的地址,equals方法也是继承object,String重写了equals方法,Object中equals是跟== 一样的比较的都是栈的地址,经过String类改写后equals将堆对象的内容取出逐一比较。这就是==与equals的区别。
2024-03-06 20:46:42
129
1
原创 【Spring Boot 简介及快速搭建】
SpringBoot简介,IDEA2020使用Maven方式搭建SpringBoot项目,IDEA2020使用SpringInitializer快速创建Spring Boot项目
2023-06-07 09:32:30
208
1
原创 JAVA语言基础
Java语言简介认识Java(Java发展简介)Java语言特点Java应用程序机制Java虚拟机 (Java Virtual Machine)认识Java(Java发展简介)Java现在流行语言之一,是由SUM公司开发的一套编程语言,利用C++开发一套OAK(橡树)平台,由于版权改为Java,在1995年5月23日推出正式的JDK1.0开发包。SUM公司是一家从事硬件开发的公司,代表产品小型机(广泛运用在amazon上)。经历九十年代末2000年初,经历互联网低潮SUM公司被Oracle收购。
2020-12-31 17:38:51
144
原创 JAVA语言基础
JAVA语言基础-Java编程入门-Java语言简介认识Java(Java发展简介)Java语言特点Java应用程序机制Java虚拟机 (Java Virtual Machine)认识Java(Java发展简介)Java现在流行语言之一,是由SUM公司开发的一套编程语言,利用C++开发一套OAK(橡树)平台,由于版权改为Java,在1995年5月23日推出正式的JDK1.0开发包。SUM公司是一家从事硬件开发的公司,代表产品小型机(广泛运用在amazon上)。经历九十年代末2000年初,经历互联网
2020-12-31 17:27:15
365
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人