自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM面试题

JVM的跨平台性是指在不同操作系统和硬件平台上都能运行相同的Java程序,而无需对程序进行修改(一次编译,到处运行)。实现跨平台的方式主要依赖于它的工作原理。以下是详细步骤:编译源代码:Java源代码文件(.java)被编译器编译成字节码文件(.class文件)。跨平台的字节码:这些字节码文件非常特殊,它们不像其他编译语言的输出那样是特定于某种硬件的机器代码,而是一种中间代码。这使得它们可以在任何运行JVM的平台上执行。JVM的解释和执行:在目标机器上,安装有JVM的环境会解释或编译执行这些字节码。

2024-07-22 11:46:08 640

原创 JUC并发编程第十章——Java对象内存布局和对象头

1 面试题说下JUC,AQS的大致流程 CAS自旋锁,是获取不到锁就一直自旋吗?CAS和synchronized区别在哪里,为什么CAS好,具体优势在哪里? sychronized底层是如何实现的,实现同步的时候用到了CAS 了吗?具体哪里用到了? 对象头存储那些信息?长度是多少位存储?2 Object object = new Object()谈谈你对这句话的理解?位置所在-------->JVM堆->新生区->伊甸园区 构成布局-------->对象头+实例数据

2024-07-04 13:41:41 1218

原创 JUC并发编程第十四章——线程安全集合类

重点介绍 java.util.concurrent.* 下的线程安全集合类,可以发现它们有规律,里面遍历时如果发生了修改,对于非安全容器来讲,使用机制也就是让遍历立刻失败,抛出ConcurrentModifificationException,不再继续遍历。

2024-06-19 11:27:54 814

原创 JUC并发编程第十三章——读写锁、邮戳锁

无锁——>独占锁——>读写锁——>邮戳锁。

2024-06-15 19:41:21 705

原创 JUC并发编程第十二章——AQS

这些并发编程中常用的类,底层实现基本上都和AQS有关Semaphore可以看到以上类的内部都有一个继承了AQS的抽象类Sync。进一步理解锁和同步器的关系锁,面向锁的使用者:定义了程序员和锁交互的使用层API,隐藏了实现细节,程序员调用即可实现功能同步器,面向锁的实现者:Java并发大神DoungLee,提出了统一规范并简化了锁的实现,将其抽象出来,屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等,是一切锁和同步组件实现的----公共基础部分。

2024-06-13 17:28:37 1277

原创 JUC并发编程第十一章——Synchronized与锁升级机制

偏向锁:MarkWord存储的是。

2024-06-12 17:48:33 1245

原创 JUC并发编程第九章——ThreadLocal

ThreadLocal中ThreadLocalMap的数据结构和关系ThreadLocal的key是弱引用,这是为什么?ThreadLocal内存泄漏问题你知道吗?ThreadLocal中最后为什么要加remove方法?方法详细信息返回此线程局部变量的当前线程的“初始值”。该方法将被调用的第一次一个线程访问与可变get()方法,除非线程先前调用的set(T)方法,在这种情况下initialValue方法将不被调用的线程。

2024-06-05 23:17:56 1362

原创 JUC并发编程第八章——原子操作类

CountDownLatch 是 Java 中的一个并发工具类,用于协调多个线程之间的同步。其作用是让某一个线程等待多个线程的操作完成之后再执行。它可以使一个或多个线程等待一组事件的发生,而其他的线程则可以触发这组事件。public final int get(int i) //获取 index=i 位置元素的值public final int getAndSet(int i, int newValue)//返回 index=i 位置的当前的值,并将其设置为新值:newValue。

2024-06-01 20:43:26 1101

原创 JUC并发编程第七章——CAS

注意:compareAndSet方法有两个参数,第一个参数是希望当前的atomicInterger是多少 (一般就是我们从主内存中拿取当前atomicInterger时候的值) ,第二个参数是希望修改为多少,如果当前atomicInterger的值是我们希望的值,就会修改为我们希望修改的值,反之不会修改。ps:面试时,需要懂Unsafe类,因为说白了原子类靠的是CAS思想,CAS思想落地实现靠Unsafe类的CPU源语级别的汇编操作,但是工作中不要用Unsafe类,因为用不好容易导致内存混乱。

2024-05-30 20:00:07 1351

原创 JUC并发编程第六章——volatile与JMM

两个屏障,一个加在volatile写之前的StoreStore屏障,防止上面的写操作和当前volatile写重排;内存屏障(也称内存栅栏,屏障指令等)是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作,避免代码重排序。:处理器在读屏障之后的读操作,都在读屏障之后执行 (因为前面的写屏障已经保证全部写完了,主内存中都是最新数据了)。在store2及其后的写操作执行前,保证Store1的写操作已经刷新到主内存。

2024-05-28 18:19:32 1028

原创 JUC并发编程第五章——Java内存模型JMM

CPU的运行并不是直接操作内存而是先把内存里面的数据读到缓存,而内存的读和写操作的时候会造成不一致的问题。JVM规范中试图定义一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序再各种平台下都能达到一致性的内存访问效果。,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入以及如何变成对另一个线程可见,关键技术点都是围绕多线程的。● JMM没有那些特征或者它的三大特征是什么?● 你知道什么是Java内存模型JMM吗?

2024-05-24 14:07:11 486

原创 JUC并发编程第四章——LockSupport与线程中断

首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了其次,在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制----中断,也即中断标识协商机制中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自行实现。

2024-05-22 10:21:05 1404

原创 JUC并发编程第三章——Java中的锁

2.1悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改synchronized和Lock的实现类都是悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确,显示的锁定之后再操作同步资源一句话定义:狼性锁乐观锁认为自己在使用数据的时候不会有别的线程修改数据或资源,所以不会添加锁Java中使用无锁编程来实现,只是在更新的时候去判断,之前有没有别的线程更新了这个数据如果这个数据没有被更新,当前线程将自己修改的数据成功写入。

2024-05-15 13:40:55 264

原创 JUC并发编程第二章——CompletableFuture

举例:比如主线程让一个子线程去执行任务,子线程可能比较耗时,启动子线程开始执行任务后,主线程就去做其他事情了,忙完其他事情或者先执行完,过了一会再才去获取子任务的执行结果或变更的任务状态(老师上课时间想喝水,他继续讲课不结束上课这个主线程,让学生去小卖部帮老师买水完成这个耗时和费力的任务)。Future接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消异步任务的执行、判断任务是否被取消、判断任务执行是否完毕等。

2024-05-09 09:40:20 989

原创 JUC并发编程第一章——线程基础知识复习

Monitor其实是一种同步机制,它的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代码,JVM中同步是基于进入和退出监视器(Monitor管程对象)来实现的,每个对象实例都会有一个Monitor对象,Monitor对象和Java对象一同创建并销毁,底层由C++语言实现。○并行(parallel):是在不同实体上的多个事件,是在多台处理器上同时处理多个任务,同一时刻,大家都在做事情,你做你的,我做我的,各干各的。○用户线程:是系统的工作线程,它会完成这个程序需要完成的业务操作。

2024-05-08 15:35:51 623

原创 算法刷题记录2

每次都在已经解锁 (当前手上有的钱大于某个项目的花费,该项目就算是被解锁)了的项目中选一个利润最大的项目。要注意的是,每次做完一次项目,手头上的钱就变为:之前的钱+本次项目的利润。因此本题就是从边界上的O开始递归,找与边界O联通的O,并标记为#(代表已遍历),最后图中剩下的O就是:被X包围的O。如果我每次移动都遵守这个规律,每次要移动大盘的时候,就把上面的小盘全部移都,把大盘空出来,这次移动就保证了大盘一定不会叠着小盘,且大盘在小盘下。当前加入的元素,就是比栈顶弹出的元素大且离它最近的元素。

2024-04-16 10:50:12 1119

原创 Java面试八股文

现在的问题就是:出现页面加载过慢,响应时间过长。我怎么确定就是我sql的问题呢?就算是sql的问题,我应该怎么找出执行慢的那条sql语句呢?这个工具,可以直观看到每个接口的执行时间。还可以追踪进接口,详细的看耗时情况,其中也包含了sql的耗时。慢查询的概念:在MySQL中,慢查询是指执行时间超过一定阈值的SQL语句。所设定的时间,那么这条SQL语句就被认为是慢查询。也就是说,如果一条SQL语句的执行时间超过了。简单来说,这个日志记录了执行时间较长的sql。参数设定的,它的默认值是10秒。

2024-03-17 09:37:07 950 7

原创 算法题目记录

【代码】算法题目记录。

2024-03-09 18:51:27 916 1

原创 数据结构与算法

Comparable和Comparator都是用于比较对象大小的接口,但Comparable是在类内部实现的比较方式,而Comparator是在类外部实现的比较方式。Comparable适合于在类设计阶段就已经考虑到了比较的需求,而Comparator更适合于在运行时根据需要动态地指定比较方式。在实际编程中,我们需要根据具体的情况选择使用哪种方式,以达到最佳的效果。

2024-03-06 16:20:08 578 1

原创 Java中的垃圾回收器

说明:下图中 e代表eden区(伊甸园),s代表幸存者区,o代表老年代初始时,所有区域都处于空闲状态创建了一些对象,挑出一些。

2024-07-23 09:55:56 675

原创 Java中类装载的执行过程

Class文件在其常量池会通过字符串记录自己将要使用的其他类或者方法,检查它们是否存在例:方法或者类在引用时,都会到常量池中查表翻译,找到对应的类或方法。类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。这个类是否继承(extends)了被final修饰过的类(被final修饰过的类表示类不能被继承)作为方法区这个类的各种数据的 访问入口。当类不再被使用,且没有任何活跃的类加载器实例时,类及其相关的资源将被垃圾回收器回收。

2024-07-23 09:55:49 441

原创 SpringBoot的自动装配原理

这个扫描的范围是:SpringBoot 主启动类的同级路径及子路径,扫描到特定的@Component、@Service、@Controler、@Repository、@Configuration等等注解后,会做相应的bean注册和配置文件bean注册工作。@Configuration在spring的注解开发中占有很重要的地位,你当你想要定义一个配置类并交给spring管理的时候你就可以在相关类上面加这个注解,并配合@Bean注解把对象交个spring去管理。该注解是三个注解的复合注解。

2024-07-22 11:46:59 818

原创 Java中volatile关键字

保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。

2024-07-22 11:46:51 950

原创 sql优化

使用union all 的话,就会把两条sql所有符合条件的查询结果直接合并。使用union的话,就会多一步过滤,过滤掉二者的重复项。而使用内连接,就会优先把小表放外面,大表放里面。当有写操作进来的时候,就会走Master数据库,进行写操作,然后Master数据库再把数据同步到Slave数据库。循环三次的可以看作小表,循环1000次的看作大表。小表放外面,MySql只需要连接三次数据库,然后在里面执行1000次操作。1.指明字段名称,可以尽量使用覆盖索引,避免回表查询,因此可以提高效率。

2024-07-22 10:16:01 490

原创 HashMap扩容机制

这里拆分链表时的一个比较:e.hash & oldCap == 0 意思是:某一个节点的hash值和老数组容量求&运算。如果等于0,当前元素在老数组中的位置就是在新数组中的位置。如果不等于0,它存储的位置是:原来老数组中的位置 + 老数组容量。现在要拆分标明的这个节点,该点在老数组中的位置是3。如果该点的hash & oldCap == 0。则把该点挂在新数组的也是3的位置。如果不为0,则挂在 3 + 16 = 19 的位置。例:假设老数组容量是16,新数组就是32。

2024-07-22 10:15:51 215

原创 Java中的内存屏障

内存屏障(也称内存栅栏,屏障指令等)是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作,避免代码重排序。内存屏障其实就是一种JVM指令,Java内存模型的重排规则会要求Java编译器在生成JVM指令时插入特定的内存屏障指令,通过这些内存屏障指令,volatile实现了Java内存模型中的可见性和有序性(禁重排),但volatile无法保证原子性。在Store2及其后的写操作执行前,保证Load1的读操作已经结束。

2024-07-19 11:32:36 707 1

原创 synchronized 锁的到底是什么?

1-2:一个对象里面如果有多个 synchronized 方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法,其它线程都只能等待。换句话说,某一个时刻内,只能有唯一的一个线程去访问这些synchronized方法。锁的是当前对象this,被锁定后,其它线程都不能进入到当前对象的其它的synchronized方法3-4:加个普通方法后发现和同步锁无关换成两个对象后,不是同一把锁了,情况立即变化5-6:都换成静态同步方法后,情况又变化。

2024-07-19 11:32:25 743

原创 如何安全的停止一个线程

一旦发生中断,就执行相应的中断处理业务逻辑stop线程。

2024-07-19 11:31:14 295

原创 spring容器的启动流程

它是Spring处理注解主要的类。

2024-07-19 11:26:27 760

原创 并发情况导致事务失效的场景

这里synchronized锁整个UserController类。确保同一时间只有一个userInfoService调用testDemo方法。如此一来,同一时间只有一个线程进入testDemo方法,一个线程提交事务。不再会出现多线程同时提交导致数据被覆盖的情况了!说明:为什么多线程一起提交事务就会导致数据丢失。因此这个锁的范围,必须包含整个事务。这里说一下我的理解:事务失效的原因。这里创建多个线程模拟多并发场景。

2024-07-19 11:24:27 648

原创 RabbitMQ中的交换机类型

另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!不过队列一定要与交换机绑定。消息的发送方在 向 Exchange发送消息时,也必须指定消息的。Exchange不再把消息交给每一个绑定的队列,而是根据消息的。队列与交换机的绑定,不能是任意绑定了,而是要指定一个。

2024-07-10 10:13:35 809

原创 MySQL中的redo log 和 undo log

当我们操作增删改的时候,会有大量的update等语句,如果我们同步刷新,对磁盘IO次数太多了,每执行一条sql可能就要进行一次连接数据库。如果没有,就会把磁盘中的数据(某一个数据页的数据)加载到缓冲池中。现在内存中的数据页被操作完了,但还没同步到磁盘中 (此时这个数据页称为脏页),这个时候服务器宕机了,同步失败了。内存中的数据可能就消失了,数据丢失了。等到脏页刷新完成后,可以认为redo log不需要了,进行定期清理,等下一个事务需要的时候,又往里面填写内容,文件不会删除,而是重复利用。

2024-07-10 10:13:17 1065

原创 Java中的类加载器

启动类加载器(Bootstrap ClassLoader):这是JVM自带的类加载器,负责加载Java的核心类库,如rt.jar等。由于安全原因,启动类加载器加载的类不能被其他类加载器加载的类所引用。扩展类加载器(Extension ClassLoader):负责加载Java的扩展类库,一般位于$JAVA_HOME/jre/lib/ext目录下。系统类加载器(System ClassLoader)

2024-07-09 09:57:54 746

原创 synchronized底层原理

与轻量级锁不同的时,这里不会再 次进行cas操作,只是判断对象头中的线程id是否是自己,因为缺少了cas操作, 性能相对轻量级锁更好一些。如果为null直接获取对象锁。2.通过CAS指令将Lock Record的线程id存储在对象头的mark word中,同时也设 置偏向锁的标识为101,如果对象处于无锁状态则修改成功,代表该线程获得了 偏向锁。2.通过CAS指令将Lock Record的地址存储在对象头的mark word中(数据进行交 换),如果对象处于无锁状态则修改成功,代表该线程获得了轻量级锁。

2024-07-09 09:57:46 1721

原创 Java线程池及面试题

Executor框架是 Java5 之后引进的,在 Java 5 之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免 this 逃逸问题。this逃逸指的是在对象的构造过程中,当对象还没有完全初始化完成时(构造函数执行完毕),就将该对象的引用传递给了外部环境。这种情况可能会导致对该对象的访问出现不一致性或者线程安全问题。

2024-07-08 16:55:50 1129

原创 Java异常

Java异常是Java提供的一种识别及响应错误的一致性机制。

2024-07-08 16:55:29 824

原创 Shiro框架2——shiro的认证+shiro的授权

通过分析源码可得:认证:1.最终执行用户名比较是 在SimpleAccountRealm类 的 doGetAuthenticationInfo 方法中完成用户名校验2.最终密码校验是在 AuthenticatingRealm类 的 assertCredentialsMatch方法 中总结:认证realm授权realm自定义Realm的作用:放弃使用.ini文件,使用数据库查询。

2024-07-08 16:55:04 1122

原创 Shiro框架1——基础概念

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

2024-07-08 16:54:53 735

原创 Spring中Bean的生命周期

如果Bean实现了以Aware结尾的接口,就要重写里面的方法。图中三个接口,就是分别用于在Bean的初始化过程中,用于获取:Bean的名字、Bean的工厂、容器的上下文对象(Spring容器本身)。就会在这一步执行这个方法。而在这一步就会执行重写方法。如果在哪个方法上标注了@PreDestroy方法,Spring容器在关闭前就会调用该方法。当一个类的功能被增强了使用到了AOP,大概率就是使用后置处理器被增强的。bean的后置处理器,在初始化方法调用之前执行。bean的后置处理器,在初始化方法调用之后执行。

2024-05-21 09:49:14 904 1

原创 拦截器和过滤器的区别

拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且他是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下SpringMVC这一部分的源码,其实还是比较容易理解的。

2024-05-21 09:48:52 835 1

空空如也

空空如也

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

TA关注的人

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