自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java 框架

AOP(面向切面编程)是一种编程范式,它是面向对象编程(OOP)的一种补充。AOP旨在通过将横切关注点(例如日志记录、安全性、事务管理等)从应用程序的核心业务逻辑中分离出来,从而提高代码的模块化性和可维护性。在传统的面向对象编程中,一个类通常负责一个特定的功能,而横切关注点则散布在各个类的方法中。这样导致了横切关注点代码的重复和散乱,不利于代码的维护和扩展。AOP的目标是将这些横切关注点从各个类中剥离出来,并通过特殊的方式将它们应用到需要的地方,从而使代码更加简洁和易于维护。

2023-08-04 14:02:54 178

原创 java 并发

线程是进程中的最小执行单元,是CPU调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源,包括内存空间、文件描述符等。线程之间可以并发执行,使得程序可以同时处理多个任务,提高了系统的响应能力和并发性。进程是操作系统中的一个执行实例,是程序在计算机上的一次执行活动。每个进程都有自己独立的内存空间和系统资源,进程之间是相互独立的。进程的切换代价相对较高,因为需要保存和恢复进程的所有状态信息。为什么要有线程?在单核CPU时代,进程是独立运行的,每个进程有自己的地址空间,进程之间切换开销大。

2023-08-03 00:46:18 144

原创 JVM 学习

自定义类加载器可以继承ClassLoader类并重写其findClass()方法来实现自定义的类加载逻辑。在某些特定需求下,可能需要自定义类加载器来加载一些特殊的类,例如从网络、数据库或特定资源中加载类。

2023-08-02 01:18:21 515

原创 java 基础

Java的基本数据类型是一组预定义的数据类型,用于存储简单的值,而不是对象。Java中的基本数据类型具有固定的大小和默认值。byte:1字节,范围为-128到127。short:2字节,范围为-32,768到32,767。int:4字节,范围为-231到231-1。long:8字节,范围为-263到263-1。float:4字节,范围为IEEE 754规定的浮点数范围,一般精度为6-7位小数。double:8字节,范围为IEEE 754规定的浮点数范围,一般精度为15位小数。

2023-08-01 00:50:35 72

原创 如如何看待理论和实践的关系

理论和实践是密不可分的两个方面,在软件开发领域尤其如此。它们之间的关系可以被概括为:理论指导实践:理论是经验和知识的积累,为实践提供指导。在软件开发中,理论包括算法、设计模式、编程原则等。理论帮助开发人员理解问题的本质,提供解决问题的思路和方法,从而指导实际的编码和开发过程。实践验证理论:实践是将理论付诸于实际的过程,通过实际开发项目来验证理论是否有效。有时候,理论可能看起来很好,但在实际应用中可能会遇到各种挑战和限制。通过实践,我们可以发现理论的局限性并进行改进,也可以验证理论是否适用于特定的场景。

2023-07-28 00:24:19 314

原创 java IO操作

select适用于较小规模的连接数和跨平台需求,但效率较低。poll适用于较大规模的连接数和跨平台需求,但仍然存在效率限制。epoll适用于大规模的并发连接和高性能需求,但仅在Linux上可用。请注意,选择使用哪种机制取决于应用的需求和目标平台。

2023-05-29 16:46:07 648

原创 消息队列,问题与处理方案梳理

1、如何保证消息不被重复消费?一、为什么会出现重复消费的问题?RabbitMQ、RocketMQ、Kafka 都有可能出现重复消费的问题,导致重复消费的原因可能出现在生产者,也可能出现在 MQ 或 消费者。这里说的重复消费问题是指同一个数据被执行了两次,不单单指 MQ 中一条消息被消费了两次,也可能是 MQ 中存在两条一模一样的消费。生产者:生产者可能会重复推送一条数据到 MQ 中,为什么会出现这种情况呢?也许是一个 Controller 接口被重复调用了 2 次,没有做接口幂等性导致的;也可能是推送

2022-04-10 18:31:15 5228

原创 进程与java线程间的通信方式

进程间的几种通信方式说一下?管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。管道分为 pipe(无名管道)和 fifo(命名管道)两种,有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。消

2022-04-10 00:17:28 256

原创 Mysql explain 命令字段详解

explain命令通过explain命令我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。explain命令输出的结果有10列:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extraid包含一组数字,表示查询中执行SELECT子句或操作表的顺序。在id列上也会有几种情况:如果id相同执行顺序由上至下。如果id不相同,id的序号

2022-04-09 17:43:33 327

原创 Java内存模型JMM

Java 内存模型Java 内存模型(JMM)是一种抽象的概念,并不真实存在,它描述了一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问方式。试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。注意JMM与JVM内存区域划分的区别:JMM描述的是一组规则,围绕原子性、有序性和可见性展开;相似点:存在共享区域和私有区域主内存与工作内存处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛

2022-04-08 16:44:35 132

原创 Spring MVC执行流程

2022-04-05 16:51:49 401

原创 Spring 事务失效

2022-04-05 15:32:12 381

原创 ThreadLocal

2022-04-04 16:03:35 227

原创 java JUC 面试

说说 AtomicInteger 和 synchronized 的异同点?相同点都是线程安全不同点1、背后原理synchronized 背后的 monitor 锁。在执行同步代码之前,需要首先获取到 monitor 锁,执行完毕后,再释放锁。原子类,线程安全的原理是利用了 CAS 操作。2、使用范围原子类使用范围是比较局限的,一个原子类仅仅是一个对象,不够灵活。而 synchronized 的使用范围要广泛得多。比如说 synchronized 既可以修饰一个方法,又可以修饰一段代码,相当于.

2022-04-02 19:13:16 502

原创 Lock和AQS详解,Lock VS synchronized

锁 ( lock ) 和同步块 ( synchronized block ) 之间的差异使用 synchronized 块和使用 Lock API 之间几乎没有区别:同步块完全包含在方法中 : 在独立的方法中,我们可以使用 Lock 提供的 lock() 和 unlock() 实现锁和解锁操作。同步块不支持公平竞争,任何线程都可以获取释放的锁定,且不能指定优先级。但锁 ( Lock ) 就不一样了,可以通过指定公平属性来实现 Lock 中的公平性。这可以确保最长的等待线程被授予锁定权限。如果线程无法

2022-04-02 18:37:56 390

原创 java 线程状态转换,sleep与wait区别

sleep和wait的区别

2022-04-02 00:04:10 479

原创 c++ 学习记录

https://www.whcsrl.com/blog/1031879

2021-11-11 15:17:45 98

原创 SpringMVC, java, 过滤器, 拦截器, 监听器, Filter, Intercept, Listener

文章目录一.过滤器1.java代码,写个类实现Filter接口(implements Filter)2.在web.xml如下小菜:1.判断是否是Ajax请求2.另外一般出来编码问题的时候会直接在web.xml中加上这段:这个不需要再写java代码,因为它指向的代码是org.springframework.web.filter.CharacterEncodingFilter已经存在的。直接复制可用,无需改动。二.拦截器1.java代码部分,需要一个继承了HandlerInterceptorAdapter抽象类

2020-10-12 15:54:44 290

原创 分布式事务,这一篇就够了

文章目录基础理论事务分布式事务强一致性、弱一致性、最终一致性CAP 原则BASE 理论柔性事务幂等操作分布式事务使用场景转账下单扣库存同步超时分布式事务的解决方案两阶段提交/XATCC本地消息表可靠消息最终一致性尽最大努力通知分布式事务实战两阶段提交/XATCC可靠消息最终一致性本地消息表最大努力通知总结基础理论事务事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。事务应该具有

2020-09-16 14:37:24 401

原创 面试之不得不说的数据库索引

文章目录MySQL索引原理索引目的索引原理磁盘IO与预读索引的数据结构详解b+树b+树的查找过程b+树性质建索引的几大原则B+Tree相对于B-Tree有几点不同:索引实战题型一题型二题型三题型四题型五MySQL索引原理索引目的索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的,如果我想找到m开头的单词呢?或者ze开头的单词呢?是不是觉得如果没有索引

2020-09-15 16:52:43 123

原创 详解java锁之java“锁“事

文章目录1. 乐观锁 VS 悲观锁2. 自旋锁 VS 适应性自旋锁3. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁无锁偏向锁轻量级锁重量级锁4. 公平锁 VS 非公平锁5. 可重入锁 VS 非可重入锁6. 独享锁 VS 共享锁结语Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍1. 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的

2020-09-14 16:05:40 186

原创 线程安全的List, 从Vector 到 SynchronizedList 到 CopyOnWriteArrayList

文章目录大部分人会脱口而出:用Vector,这样只会让面试官鄙视!除了Vector,你还会别的吗?你至少还得说得上这种:java.util.Collections.SynchronizedList它能把所有 List 接口的实现类转换成线程安全的List,比 Vector 有更好的扩展性和兼容性,Syfinal List list;SynchronizedList(List<E> list) { super(list); this.list = list;}nch

2020-09-10 16:27:35 305

原创 彻底搞懂String, 字符串常量池, intern方法

来看一段代码:public static void main(String[] args) { String s = new String("1"); s.intern(); String s2 = "1"; System.out.println(s == s2); String s3 = new String("1") + new String("1"); s3.intern(); String s4 = "11"; System.out

2020-09-09 10:29:39 187

原创 面试: 再看数据库与缓存一致性问题

读取数据库是比较耗时的操作,如果每次都需要去数据库读取数据,会对数据库造成一定的压力,程序性能也会比较低下,所以需要引入缓存。缓存是提升程序性能的最重要、最有效、也是最简单的手段之一。引入缓存后,读操作会先去缓存中看下,如果没有命中缓存,才去读取数据库,然后把读取出来的数据再放到缓存中去,这样下一次读操作就可以命中缓存了,如果命中缓存,就可以直接把数据返回出去了。写操作,除了修改数据库,还需要删除缓存,因为不删除缓存,读的操作读到的永远都是缓存中的旧数据。先删除缓存,后修改数据库这个方案显然是有

2020-09-07 16:41:41 150

原创 面试: 排序算法总结

文章目录排序算法总结一、排序算法种类二、性能比较三、使用场景简单排序算法冒泡排序选择排序插入排序复杂排序算法快速排序归并排序堆排序希尔排序高级排序算法计数排序基数排序桶排序排序算法总结查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还

2020-09-07 14:53:12 203

原创 海量数据面试题

文章目录1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?2. 有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。4. 海量日志数据,提取出某日访问百度次数最多的那个IP。5. 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.

2020-09-04 15:25:08 229

原创 彻底搞懂 MySQL 事务的隔离级别

MySQL的事务隔离级别一共有四个,分别是读未提交、读已提交、可重复读以及可串行化。文章目录事前准备数据事务并发可能出现的情况脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom)事务的隔离级别读已提交(READ COMMITTED)可重复读(REPEATABLE READ)可串行化(SERIALIZABLE)隔离级别的实现原理查看当前会话隔离级别设置隔离级别事前准备数据mysql> create table city( -> id

2020-09-04 13:46:06 458 1

原创 Java中创建对象的5种方式

文章目录1.使用new关键字2.使用Class类的newInstance方法3.使用Constructor类的newInstance方法4.使用clone方法5.使用反序列化作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。然而这里有很多创建对象的方法,我们会在这篇文章中学到。Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码1.使用new关键字这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和

2020-09-04 10:50:20 192

原创 Java对象的序列化和反序列化, serialVersionUID作用

文章目录一、序列化和反序列化的概念二、JDK类库中的序列化API三、serialVersionUID的作用一、序列化和反序列化的概念把对象转换为字节序列的过程称为对象的序列化。  把字节序列恢复为对象的过程称为对象的反序列化。  对象的序列化主要有两种用途:  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;  2) 在网络上传送对象的字节序列。在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对

2020-09-04 10:42:47 215

原创 Java 并发编程:volatile的使用及其原理

文章目录一、volatile的作用二、volatile的使用三、volatile的原理一、volatile的作用我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操作,对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用Synchronized来解决问题。而volatile关键字就是Java中提供的另一种解决可见性和有序性问

2020-09-03 11:03:10 124

原创 Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

一、线程的状态Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。New:新建状态,当线程创建完成时为新建状态,即new Thread(…),还没有调用start方法时,线程处于新建状态。Runnable:就绪状态,当调用线程的的start方法后,线程进入就绪状态,等待CPU资源。处于就绪状态的线程由Java运行时系统的线程调度程序(thread scheduler)来调度。Running:运

2020-09-03 09:51:13 96

原创 Java 并发编程:CAS、ABA问题、Synchronized底层优化, 偏向锁、轻量级锁、 重量级锁、原理与实现,悲观锁,乐观锁

一、重量级锁现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。JDK中对Synchronized做的种种优化,其核心都是为了减少这种重量级锁的使用。

2020-09-02 15:45:18 223

原创 面试之redis事务

MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项:Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。 > 在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。因此,Redis事务能够保证原子性。EXEC命令会触发执行事务

2020-08-20 17:33:55 127

原创 leetcode 33. 搜索旋转排序数组

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例 2:输入: nums = [4,5,6,7,0,1,2], target =

2020-08-17 17:19:36 85

原创 session和cookie区别

本来 session 是一个抽象概念,开发者为了实现中断和继续等操作,将 user agent 和 server 之间一对一的交互,抽象为“会话”,进而衍生出“会话状态”,也就是 session 的概念。 而 cookie 是一个实际存在的东西,http 协议中定义在 header 中的字段。可以认为是 session 的一种后端无状态实现。而我们今天常说的 “session”,是为了绕开 cookie 的各种限制,通常借助 cookie 本身和后端存储实现的,一种更高级的会话状态实现。所以 cookie

2020-08-14 16:49:27 86

原创 面试, Mysql优化, MySQL性能优化的21个最佳实践

文章目录1. 为查询缓存优化你的查询2. EXPLAIN 你的 SELECT 查询3. 当只要一行数据时使用 LIMIT 14. 为搜索字段建索引5. 在Join表的时候使用相同类型的列,并将其索引6. 千万不要 ORDER BY RAND()7. 避免 SELECT \*8. 永远为每张表设置一个ID9. 使用 ENUM 而不是 VARCHAR10. 从 PROCEDURE ANALYSE() 取得建议11. 尽可能的使用 NOT NULL12. Prepared Statements13. 无缓冲的查询

2020-08-03 16:42:42 292

原创 try、catch、finally用法总结

try、catch、finally用法总结:1、不管有没有异常,finally中的代码都会执行2、当try、catch中有return时,finally中的代码依然会继续执行3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不

2020-07-08 17:35:10 330

原创 Oracle 常用系统函数,以及示例

–一.字符型函数----1.ASCII©和CHR(I)函数,字符和ASCII之间的转换SELECT ASCII(‘Z’) Z FROM DUAL;SELECT CHR(90), (32) S FROM DUAL;----2.CONCAT(S1,S2) 函数, S2连接到S1后SELECT CONCAT('Hello ',‘World’) INFOMATION FROM DUAL;----3.INITCAP(S)函数, 将字符串中每个单词第一个字母大写, 单词中其他字母小写SELECT IN

2020-06-18 13:11:27 245

原创 JAVA8十大新特性,lambda表达式详解

一、接口的默认方法Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:interface Formula {double calculate(int a);default double sqrt(int a) { return Math.sqrt(a);}}Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqr

2020-06-02 18:44:58 742

原创 ConcurrentHashMap实现线程安全的底层原理, 1.7和1.8的比较,vs hashtable

ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEntry 用来封装映射表的键 / 值对;Segment 用来充当锁的角色,每个 Segment 对象守护整个散列映射表的若干个桶。每个桶是由若干个 HashEntry 对象链接起来的链表。一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。Hash...

2020-04-26 09:23:58 1930

空空如也

空空如也

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

TA关注的人

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