自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

码代码的小朋友

用于学习交流,提高自己

  • 博客(51)
  • 收藏
  • 关注

原创 学习笔记12——并发编程之线程之间协作方式

它通过内置的阻塞机制,让生产者线程和消费者线程自动协调工作,无需开发者手动管理。是一个同步辅助工具,允许一组线程相互等待,直到所有线程到达屏障点后才能继续执行。实现:初始化时指定许可数,线程调用acquire()获取许可,调用release()释放许可。通过阻塞队列,生产者和消费者线程无需直接交互,只需要操作队列即可自动协调;:消费者线程尝试从空队列取数据时,会被阻塞直到队列非空。若队列已满,生产者线程阻塞,等待消费者取走数据后唤醒。若队列为空,消费者线程阻塞,等待生产者放入数据后唤醒。

2025-03-10 22:15:12 947

原创 学习笔记11——并发编程之并发关键字

为了保证各个处理器的缓冲是一致的,实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓冲的值是不是过期了,当处理器发现自己缓存行对应的 内存的地址被修改了,就会将当前处理器的缓存行设置为无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓冲中。所谓自旋,就是指当有另外一个线程来竞争锁时,这个线程会在原地循环等待,而不是把该线程给阻塞,直到那个获得锁的线程释放锁之后,这个线程就可以马上获得锁的。中,导致一个线程修改了变量的值,其他线程无法立即看到最新值;

2025-03-10 21:42:37 1206

原创 学习笔记10——并发编程2线程安全问题与同步机制

线程修改共享变量后,其他线程无法立即看到最新值(CPU缓存与主存不一致)。:编译器或处理器优化可能导致代码执行顺序与源码不一致,破坏预期逻辑。:多个线程对同一资源进行非原子操作,导致结果依赖线程执行顺序。:代码简洁,JVM 自动优化锁升级,适合大多数低竞争场景。可见性:一个线程修改共享变量后,其他线程能立即感知变化。使用读写锁:读操作频率远高于写操作(如热点数据缓存)。原子性:确保操作不可分割,要么全部执行,要么不执行。使用原子类:单一变量的原子操作(如计数器、标志位)。,导致程序行为不符合预期。

2025-03-07 07:22:37 773

原创 学习笔记09——并发编程之线程基础

用户线程:完全在用户空间实现,由线程库(如JVM)管理,内核无感知。无法利用多核并行(内核仅调度进程,进程内仅一个内核线程)。内核线程:由操作系统直接支持,每个线程对应一个内核线程。进程是操作系统分配资源的基本单位,而线程是CPU调度的基本单位。类,重写run方法,单继承的局限性(Java 不支持多继承),无法继承其他类。:操作系统分配资源(如内存、文件句柄等)的基本单位,拥有独立的地址空间。:隶属于进程,共享进程的资源(如内存、文件等),是CPU调度的基本单位。接口,重写run方法,推荐使用,无返回值。

2025-03-04 07:01:38 633

原创 学习笔记08——ConcurrentHashMap实现原理及源码解析

解决HashMap线程不安全问题:多线程put可能导致死循环(JDK7)、数据覆盖(JDK8)优化HashTable性能:通过细粒度锁替代全局锁,提高并发度锁分离:降低锁竞争概率乐观锁优先:CAS无锁化尝试粒度细化:从分段锁到桶级别锁无锁读:volatile变量保证可见性7.面试回答模板面试官:请说一下ConcurrentHashMap的实现原理。回答ConcurrentHashMap在JDK1.8中采用了数组+链表/红黑树的结构,通过CAS和synchronized实现高并发。写操作。

2025-03-01 22:35:46 669

原创 学习笔记07——生产者-消费者模型4种实现方式

生产者-消费者实现方式

2025-02-27 23:46:44 405

原创 学习笔记06——JVM调优

JVM 调优是一个复杂而细致的工作,需要结合应用的特点和运行环境进行调整。通过合理设置 JVM 参数、选择合适的 GC 算法、监控和分析 GC 日志,可以显著提升应用性能,降低延迟,提高资源利用率。希望本文的内容能够帮助开发者更好地理解和优化 JVM,提升应用性能。

2025-02-26 20:09:31 853

原创 学习笔记05——HashMap实现原理及源码解析(JDK8)

HashMap通过数组存储Node节点解决快速定位问题,使用链表和红黑树处理哈希冲突。当执行put操作时,首先计算键的扰动哈希值确定桶位置。若发生哈希冲突,JDK8采用尾插法维护链表,当链表长度达到树化阈值时会转换结构提升查询效率。扩容时采用2倍扩容策略,通过位运算快速重新分配节点位置,这个设计避免了重新计算哈希的开销。需要注意的是,HashMap不是线程安全的,多线程put可能导致数据丢失或死循环(JDK7版本)。建议结合手写伪代码/流程图进行说明,展现对底层实现的深入理解。

2025-02-25 20:26:03 671

原创 学习笔记04——JMM内存模型

定义了线程如何与主内存(Main Memory)和工作内存(Work Memory)交互,解决多线程并发中的原子性、可见性、有序性问题。JMM定义的保证有序性的规则,若操作A happens-before 操作B,则A的结果对B可见。:所有线程共享的内存区域,存储变量(实例字段、静态字段等),类似于计算机中的物理内存。synchronized关键字:线程退出同步块时,会将工作内存中的变量写回主内存。// 主线程修改flag。:线程只能操作工作内存中的变量副本,修改后需同步回主内存。

2025-02-24 21:21:46 1193

原创 学习笔记03——《深入理解Java虚拟机(第三版)》类加载机制知识总结与面试核心要点

关键步骤继承类重写方法(非,避免破坏双亲委派)通过将字节码转换为Class对象代码示例@Override// 从自定义路径加载字节码...

2025-02-24 07:39:20 774 1

原创 学习笔记02——《深入理解Java虚拟机(第三版)》第三章

可达性分析:通过GC Roots链是否可达,具体列举至少4种GC Roots类型。

2025-02-23 15:23:09 628

原创 学习笔记01——《深入理解Java虚拟机(第三版)》第二章

一、概述理解JVM内存管理的核心设计思想,掌握内存区域的划分原理、对象生命周期与内存溢出(OOM)的根本原因及排查方法。第二章主要是围绕Java虚拟机的运行时数据区展开,详细介绍了Java虚拟机在运行Java程序时,如何分配和管理内存空间。作用:记录当前线程执行的字节码指令地址(分支、循环、跳转等依赖此区域),是一块很小的内存空间。特性:线程私有,生命周期与线程绑定。唯一无OOM的区域(无垃圾回收,无内存溢出)。核心功能:存储栈帧(Frame),每个方法调用对应一个栈帧的入栈与出栈。栈帧结构:局部变量表

2025-02-22 23:02:06 1109

原创 Java高级开发所具知识技能

通过系统掌握以上内容,能够胜任复杂业务场景下的架构设计、性能调优和分布式系统开发任务。建议结合实际项目,深入源码(如Spring、Netty、Kafka)理解实现原理。

2025-02-22 21:48:14 622

原创 Java多线程深度解析

在现代计算机架构中,多核CPU已成为主流。为了充分利用硬件资源,提升系统吞吐量和响应速度,多线程编程成为Java开发者必备的核心技能。然而,线程的创建、调度和同步也带来了复杂性——本文将深入剖析Java多线程的核心机制,并给出高并发场景下的实战解决方案。掌握Java多线程开发需要深入理解内存模型、锁机制和并发工具类。无锁 → 偏向锁(单线程) → 轻量级锁(CAS自旋) → 重量级锁(OS互斥量)真正的并发大师,不仅懂得如何创建线程,更懂得如何让线程优雅协作。

2025-02-21 21:54:24 998

原创 DAY01-如何合理配置线程池的核心参数

在Java中,如何合理配置线程池的核心参数(corePoolSize、maximumPoolSize、workQueue)?请结合不同的业务场景举例说明。:核心线程数,线程池长期维持的线程数量(即使空闲也不会被回收)。:最大线程数,线程池允许创建的最大线程数量。workQueue:任务队列,用于缓存待执行任务的阻塞队列。:线程数应与CPU核心数相近,避免过多线程导致频繁上下文切换。:可适当增大线程数,以利用线程等待IO时的空闲时间。:根据任务拆分比例调整,或通过压测确定最优值。

2025-02-20 19:42:35 377

原创 Linux中es启动成功,windows服务器访问不了的解决方案

1.在Linux服务器中安装elasticsearch。在bin目录下执行./elasticsearch报错信息:org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:174) ~[elasti

2021-09-03 16:34:52 4100

原创 SpringBoot+Mybatis实现多数据源

1.Spring的各子项目spring framework-core:这是spring项目的核心部分。其中包含了一系列的Ioc容器的设计,提供了依赖反转模式的实现,同时还集成了AOP功能;在spring frameworkcore中还包含一些基本模块,如MVC,JDBC,事务处理模块的实现。 ...

2021-07-11 16:38:49 599

原创 LeetCode-Algorithm1两数之和

题目描述:给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。解题思路:思路1:暴力循环法。思路2:借助Hashmap。判断target - num[i] 的差值,存不存在Map中。说hash冲突。 1.每次写入时,判断条件 不是当前的key本身存不存在,而是key和 tag 之间的差值存不存在,这一点很...

2021-01-19 20:35:55 286

原创 oracle随笔1-----sql逻辑执行顺序

工作中排查问题时,发现join 和exists可以 转化使用,但是并不是所有场景下都可以进行转化的。首先,我们来看下两种sql的逻辑执行顺序。exists:使用exists查询,oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项join:2.select distinct* from a (right/left/inner) join b on 条件 where 条件 group by xxx having order by逻辑执行顺序from:对子句中的前两个表

2021-01-18 15:56:27 351

原创 @Transactional失效场景分析以及解决方案

失效场景1.@Transactional 应用在非 public 修饰的方法上之所以会失效是因为在Spring AOP 代理时,TransactionInterceptor (事务拦截器)在目标方法执行前后进行拦截,DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法会间接调用 AbstractFallbackTransactionAttributeSource的 compu

2021-01-07 19:17:18 921 1

原创 随机生成100长度的字符串,求含有123子串的个数

算法题:随机生成100个字符的字符串,并统计出由123组成的子字符串的个数。import org.springframework.util.StringUtils;import java.util.Arrays;import java.util.Random;public class MainTest { public static void main(String[] args) { String[] str = new String[100]; ..

2020-12-27 11:13:41 1727 9

原创 微服务商城mall-swarm本地搭建

Mall-swarm 微服务商城系统 本地搭建环境搭建:所需要用到的开发工具版本号 下载 JDK 1.8 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html Mysql 5.7 https://www.mysql.com/ Redis 5.0 https://redis.io/download Elasti..

2020-12-26 21:28:20 2983 5

原创 synchronized的8大应用场景分析

synchronized的8大应用场景分析synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; ---对象锁  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; --对象锁  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象; ---类锁  4.

2020-12-19 10:16:59 2219 2

原创 Java面试核心知识点2——Java基础

这部分主要从Java常用的Java基础知识展开详细的介绍,具体包含Java的集合、异常分类及处理、反射机制、注解、内部类、泛型、序列化。1.集合Java的集合类被定义在Java.util包中,主要有4种集合,分别为List、Queue、Set和Map,每种集合的具体分类如图2-1所示。...

2020-07-31 08:10:35 227

原创 Java面试核心知识点1——JVM

1 JVM的运行机制我们知道JVM是用于运行Java字节码的虚拟机,主要包括一套字节码指令集、一组程序计数器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设备直接交互。Java源文件(.java文件)通过编译器被编译成.class文件(字节码文件),.class文件又被JVM中的解释器编译成机器吗在不同操作系统上运行(Windows,Mac,Linux)。每种操作系统的解释器都是不同的,但是基于解释器的虚拟机是一样的,这也是为什么Java能够跨平台的原因

2020-07-19 22:04:08 246

原创 《剑指offer》Java版 下载地址

《剑指offer》Java版 下载地址关注公众号后台回复1122 即可获取

2020-07-05 00:11:27 599 2

原创 Spring实战第五版(中文版)学习笔记-第一章 Spring起步

这一章主要讲了三部分内容Spring和Spring Boot的必备知识 初始化Spring项目 Spring生态系统概览

2020-07-04 08:33:20 2900 4

原创 多线程处理大数据量数据

最近公司需要一个新的需求,需要一个接口去跑数据。数据量还蛮大的,大约50-60万数据(一条一条执行),其中还涉及到与其他接口的交互,因此这些数据跑下来要耗时很久,因此设计了一个方案,使用多线程的方式进行处理。方案1 每次重数据库表中取一定量的数据(自己按实际情况定义)放在线程池缓存队列里,启动10个线程去线程池里去取数据。(相当于生产者和消费者的关系),这里需要有一个触发点,当我缓存里没有数据时,需要再次从数据库中再次获取数据。方案2 在数据库表中添加一个线程号字段,用来记录该条数据...

2020-07-01 22:22:25 6251 1

原创 深入理解Java虚拟机(Java面试常问知识点)

第一章 走进Java第二章 Java内存区域与内存溢出异常第一章Java程序设计语言、Java虚拟机、Java

2020-07-01 19:42:53 443

原创 若依管理系统用户管理-导出功能改造为EasyExcel

阿里巴巴的组件easyExcel

2020-05-10 17:42:44 3872 2

原创 Java内存模型

2019-06-24 09:13:41 172

原创 SSM框架面试总结

目录SpringMVC1. 什么是Spring MVC ?2. Spring MVC的工作原理3.Spring MVC的主要组键4.springmvc的常用注解5.解决post和get请求中中文乱码的方法6. SpringMVC中的拦截器问题SpringMVC1. 什么是Spring MVC ?Spring MVC是一个基于MVC架...

2019-06-10 10:43:23 790

转载 java高级工程师具备技能

2019-06-06 10:40:08 1011

原创 java高级工程师具备技能

2019-06-05 22:55:22 605

原创 2019Java面试整理——集合

1.HashMap与HashTable的区别 HashTable是线程安全,方法上添加了synchronized同步修饰,HashMap非线程安全 HashMap的key和value可以为空,HashTable的key不可以为空 HashMap继承AbstractMap,HashTable继承Dictionary,都实现了map接口 HashMap的初始容量是1...

2019-06-02 16:32:35 4091 1

原创 ConcurrentHashMap实现原理及源码解析

为什么要用ConcurrentHashMapHashMap线程不安全,而Hashtable是线程安全,但是它使用了synchronized进行方法同步,插入、读取数据都使用了synchronized,当插入数据的时候不能进行读取(相当于把整个Hashtable都锁住了,全表锁),当多线程并发的情况下,都要竞争同一把锁,导致效率极其低下。而在JDK1.5后为了改进Hashtable的痛点,Con...

2019-05-27 17:01:24 4099 3

原创 HashMap实现原理及源码解析

HashMap简介:在介绍hashmap之前,介绍几种常见的数据结构:数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平...

2019-05-27 16:41:56 192

原创 LinkedList实现原理及源码解析

LinkedList简介:LinkedList的底层是基于双向链表实现的,它具有插入删除快而查找修改慢的特点,此外,通过对双向链表的操作还可以实现队列和栈的功能。public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>,...

2019-05-27 10:29:47 537

原创 ArrayList实现原理及源码解析

ArrayList简介: ArrayList实现了List接口它是一个可调整大小的数组可以用来存放各种形式的数据。并提供了包括CRUD在内的多种方法可以对数据进行操作但是它不是线程安全的,另外ArrayList按照插入的顺序来存放数据。ArrayList是一个动态数组,实现了List<E>, RandomAccess, Cloneable, java.io.Serial...

2019-05-27 09:46:27 358

原创 JAVA集合总结——Set

1.java集合结构:java集合类主要有两个接口派生而出:Collection和map。Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类2.Set的介绍set表示数学意义上的集合概念。其主要的特点是集合中的元素不能重复,因此存入set中的每个元素都必须定义equals()方法来确保对象的唯一性。set接口中常用的几种方法:s...

2019-05-24 23:47:47 401

空空如也

空空如也

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

TA关注的人

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