- 博客(366)
- 资源 (59)
- 问答 (16)
- 收藏
- 关注
原创 MyBatis 入门教程-搭建入门工程
通过上面的操作,我们对于MyBatis有了一个简单的认识,并且知道如何直接构建MyBatis项目,脱离的Spring 框架的支持,可以直接理解到MyBatis的底层实现原理。并且通过最简单的方式理解MyBatis的原理。
2024-09-24 10:24:35 189
原创 什么是远程过程调用(RPC)
RPC,远程过程调用,是指计算机A上的进程,调用计算机B上的进程。过程中A上的进程被挂起,而B上的进程开始执行,当返回值返回到A上的时候A上的线程继续执行。调用方可以通过参数的形式将信息传递到被调用方,然后通过回传的消息来接收到反馈的结果。整个的过程对于开发来讲是透明的。远程过程调用采用客户机/服务器(C/S)模式,请求程序就可以看做一个客户机,服务提供程序就是一台服务器。和一般的本地操作过程调用一样,远程过程调用也是同步操作,在远程过程调用完成之前,需要暂时的终止请求程序。
2024-09-24 10:11:50 289
原创 Java面试篇基础部分- Java中的阻塞队列
首先队列是一种前进后出的操作结构,也就是说它只允许从队列前端进入,从队列后端退出。这个前端和后端看个人如何理解,也就是通常所说的入队和出队,队头和队尾。阻塞队列和一般队列的不同就在于阻塞队列是可以阻塞的,这里所说的并不是说队列中间或者队头队尾被拦截了,而是一种操作队列的线程的一种状态。在阻塞队列中,线程阻塞有两种情况。
2024-09-23 10:43:46 396
原创 Java面试篇基础部分- 锁详解
偏向锁的主要目的是在同一个线程多次获取某个锁的情况下尽量减少轻量级锁的执行路径,因为在轻量级锁中,需要多次的执行CAS的操作。在多线程执行过程中,同时被阻塞,他们之间等待相互之间释放锁,如果都不能释放锁就会出现死锁,为了避免出现死锁,可以对锁进行一个加超时时间的操作,或者是在适当的代码中对锁进行释放。在实际中,除了多线程之间存在竞争锁的情况,还会出现同一个锁被同一个线程多次获取的情况,偏向锁就是用于在某个线程获取某个锁之后,消除这个锁重入的开销。锁升级:无锁、偏向锁、轻量级锁、重量级锁。
2024-09-23 10:36:17 957
原创 Java面试篇基础部分-Semaphore及其用法详解
Semaphore 是一种基于计数的信号量,在定义信号量对象的时候可以设置一个阈值,然后基于这个阈值,多线程可以竞争访问信号量,线程竞争到许可的信号之后,开始执行具体的业务逻辑,业务逻辑在执行完成之后释放这个许可信号。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。Semaphore锁的释放操作也需要手动进行释放,为此为了避免线程因为异常没有正常释放锁,释放锁的操作必须在finally代码块中完成。
2024-09-23 10:30:24 194
原创 Java面试篇基础部分-ReentrantLock详解(二)
ReentrantLock 通过在构造函数public ReentrantLock(boolean fair) 中传递不同的参数来定义不同的锁,默认实现的是非公平锁。这是因为,非公平锁虽然放弃了锁的公平性,但是他的执行效率要比公平锁要高。如果没有特殊的要求建议使用非公平锁。ReentrantLock 支持公平锁与非公平锁的两种方式;公平锁是指锁的分配和竞争机制是公平的,也就是说先到先得。非公平锁是指JVM遵循随机、就近原则来进行锁的分配。
2024-09-21 09:02:17 935
原创 Java面试篇基础部分-ReentrantLock详解
ReentrantLock 是继承了Lock接口,并且实现了再接口中定义的方法,属于一个可重入的独占锁。ReentrantLock 通过自定义队列同步器(Abstract Queued Synchroinzed,AQS)来实现锁的获取与释放。那么什么是独占锁呢?独占锁就是指这个锁在同一时刻只能被一个线程所获取到,如果其他线程想要获取到这个锁,则只能在同步队列中等待;而锁的可重入是指同一个线程对同一个资源能够执行多次加锁操作。ReentrantLock 支持公平锁与非公平锁的实现。
2024-09-21 08:57:46 846
原创 Java面试篇基础部分-Synchronized关键字详解
Synchronized关键字用于对Java对象、方法、代码块等提供线程安全操作。Synchronized属于独占式的悲观锁机制,同时也是可重入锁。我们在使用Synchronized关键字的时候,可以保证同一时刻只有一个线程对该对象进行访问;也就是说它在同一个JVM中是线程安全的。Java中的每个对象都有一个monitor对象,加锁就是再竞争monitor对象。代码块加锁是通过在代码块前后分别加上monitorenter和monitorexit指令实现。方法加锁则是通过一个标记位来进行判断。
2024-09-20 08:41:26 862
原创 Java面试篇基础部分-Java语言中的锁有哪些?
Java中的锁主要是用于保障并发线程场景下的数据一致性问题。在多线程编程中为了保证数据一致性,通常需要在使用对象或者方法之前进行加锁操作。也就是说要保证在同一时间内只能由一个线程来对对象进行修改,从而保证了数据一致性,保证了数据安全问题。锁从使用角度上来说可以分为乐观锁和悲观锁,从获取资源的公平性角度上来讲可以分为公平锁和非公平锁,从是否共享资源的角度上来讲可以分为共享锁和独占锁,从锁的状态角度可以分为偏向锁、轻量级锁和重量级锁。
2024-09-20 08:33:43 915
原创 Java面试篇基础部分-线程的基本方法
线程的基本方法有wait()、notify()、notifyAll()、sleep()、join()、yield()等等,这些方法都是用来控制线程的运行,并且可以实质性的影响到线程的状态变化情况。
2024-09-19 09:24:16 1049
原创 Java面试篇基础部分-Java线程生命周期
处于运行状态的线程会主动或者被动的放弃CPU的使用权,并且暂停运行,这个时候线程会转化为阻塞状态,一直到再次进入到可以运行的状态,这个时候才会再次获取竞争CPU使用权的机会。就绪状态的线程一直在竞争CPU的使用权,如果获取到CPU的使用权,就可以执行run方法中的逻辑,这个时候线程会转换为运行状态,处于运行状态下的线程主要的任务就是执行run方法中的逻辑代码。就是在编码中使用new关键字创建一个线程,新创建的线程处于新建的状态,在创建线程的时候主要是为线程分配内存并且初始化对应的成员变量值等等操作。
2024-09-19 08:48:00 1055
原创 Java面试篇基础部分-Java中5种常用的线程池
Java中定义了一个Executor的接口并且在接口中定义了execute()方法用来执行一个线程任务。然后通过ExecutorService实现了Executor接口用来执行具体的线程操作。ExecutorService接口实现了多个类用来创建不同的线程池,其中最常见的线程池有如下几种。
2024-09-18 14:54:40 1129
原创 Java面试篇基础部分-Java线程池工作原理
可以看到以上的四种策略都是继承了RejectedExecutionHandler接口,如果无法满足实际的使用需求,开发者可以通过自己实现RejectedExecutionHandler的接口来实现自定义的拒绝策略,并且定义自定义的异常来处理拒绝之后的内容。
2024-09-18 14:39:58 1257
原创 Java面试篇基础部分-Java创建线程详解
多线程的方式能够在操作系统的多核配置上更好的利用服务器的多个CPU的资源,这样的操作可以使得程序运行起来更加高效。Java中多线程机制提供了在一个进程内并发去执行多个线程,并且每个线程都并行的去执行属于线程处理的自己的任务,这样可以提高程序的执行效率,让系统资源得到更加的高效的利用。
2024-09-13 16:08:39 970
原创 Java面试篇基础部分-Java序列化
Java对象在JVM运行的时候被创建、更新以及销毁,在JVM退出的时候,对象也会随之销毁,也就是说这些对象的整个的生命周期不会比JVM的生命周期更长。在实际应用中,有这样的一个操作,就是需要对象以及其状态在多个应用之间进行传递、共享,在有些时候需要对对象以及其状态进行持久化操作,然后在其他的应用场景中被读取对其状态进行继续处理操作。这就是Java的序列化的机制所要解决的问题。
2024-09-13 15:13:03 609
原创 Java面试篇基础部分-Java泛型详解
Java中泛型的本质是参数化类型,泛型提供了编译时类型的安全检测机制。泛型机制允许程序在编译的时候检测非法的类型,例如要实现一个对于字符串、整型、浮点型、对象类型等比较其大小的方法,就可以使用泛型,在使用的时候在明确所要比较的数据类型就可以了。当然如果不想使用泛型对象来作为参数的话,也可以通过Object类型来实现参数任意处理,因为Object是所有对象类型的父类。在具体使用的时候可以根据强制类型转换的方式来对使用的对象进行处理操作。
2024-09-13 10:22:32 1192
原创 Java面试篇基础部分-Java内部类介绍
首先需要了解什么是内部类,内部类就是定义在类的内部的类称为内部类,内部类可以根据不同的定义方式分为静态内部类、成员内部类、局部内部类和匿名内部类。
2024-09-13 10:12:41 613
原创 Java面试篇基础部分-Java注解详解
注解(Annotation)首先是Java语言提供了一种设置程序中元素关联关系的方法。是一个接口,程序可以通过反射机制获取到指定的程序元素中的注解对象,然后通过该注解对象获取到注解元素中的相关信息。注解在开发中时被经常忽略的一个部分,但也是Java中最为重要的一个部分,在平时的开发中可能都不是太注意,大家熟悉的Spring、Spring Boot等框架现在都已经将基于注解的开发发挥到了极致,可想注解在整个的Java开发中占有举足轻重的作用,如果你能很好的使用注解,或许也可以开发出属于自己的框架。
2024-09-13 08:40:40 768
原创 架构师白话分布式系统
对于分布式系统的定义,大致可以理解为如下的两个点从程序的角度上可以这样理解,程序A和程序B分别运行在两台服务器上,由两个程序相互协作完成同一个功能。这样这两个程序所组成的整体就可以叫做“分布式系统”。当两个程序相同的时候就可以将其称为“集群”。
2024-09-13 08:34:38 615
原创 Java面试篇基础部分-Java反射机制是什么
动态语言,就是指在运行的时候可以随意改变其结构的语言,例如添加新的属性或者添加新的方法,又或者是删除方法等等在语法结构上的变化。JavaScript、Ruby、Python等都是属于动态语言,这些语言又被称为是解释性的语言,也就是说不需要经过编译器的编译就可以直接解释运行。像C、C++等都不属于动态语言,他们都是经过编译之后才可以正常使用。对于Java而言,因为它存在反射机制,所以Java可归为半动态语言。也就是说Java语言也需要编译器产生.class的文件,但是反射机制提供了一种动态的性质。
2024-09-12 14:48:23 980
原创 Java面试篇基础部分-Java中的异常以及异常处理
在实际的开发过程中,往往会遇到各种各样的编程异常,如何处理这些异常,直接会影响到整个程序和系统的稳定性,如果不能在合适的地方抛出合适的异常或者是对异常进行捕获。那么就会影响到整个程序的运行。所以如何处理异常,是作为每个开发者来说必不可少的开发技能。
2024-09-12 14:35:53 792
原创 Java面试篇基础部分-Java中的集合类
Java集合是面试中经常被问到的一块内容,很多人在这个地方被面试官吊打。Java集合类被定义在java.util包中,主要有四种集合,分别是List、Queue、Set和Map,每种集合分类如下图所示。
2024-09-12 10:37:27 1333
原创 Java面试篇基础部分-Java的类加载机制
JVM在运行Java文件的时候,类加载分为5个阶段:加载、验证、准备、解析、初始化。在类初始化加载完成之后,就可以使用这个类的信息了。当这个类不需要使用的时候,就可以从JVM进行卸载。加载是指JVM读取Class文件的操作,并且根据Class的文件描述创建对应的java.lang.Class对象的过程。我们知道在Java中可以通过Class.forName()的方式进行反射操作。
2024-09-11 10:23:55 1125
原创 Java面试篇基础部分-Java 实现的I/O方式
如图所示,客户端向着服务端发送数据的时候,先将数据写入到Buffer中,然后将Buffer中的数据写入到服务端对应的Channel中,服务端在接受到数据的时候通过Channel将数据读入到Buffer中,然后从Buffer中读取数据并进行对应的处理。传统的I/O是基于数据流的方式进行I/O的读写操作;Channel和I/O流Stream类似,只不过Stream是单向的,Channel是双向的,也就是说流式只能是输入流或者输出流,但是Channel即可用来进行读操作,也可以进行写操作。
2024-09-11 08:35:56 936
原创 Java面试篇基础部分-Java中常用的I/O模型
在非阻塞的I/O模型中,用户线程需要不断的访问内核数据是否就绪,在内核数据没有准备好的时候,用户线程可以进行处理其他的任务操作,在内核的数据准备好之后,立即获取数据并且进行响应的操作。在异步的I/O模型中,用户线程不需要关心整个的I/O操作是如何进行的,只需要发情一个请求,然后等待内核返回成功还是失败的信号,说明I/O操作已经完成,直接使用数据就可以了。在内核数据就绪的时候,系统会发送一个对应的信号量到用户的线程中,用户线程接收到信号量之后,会在信号函数中调用对应的I/O进行读写,完成实际的I/O操作。
2024-09-10 14:34:11 1127
原创 Java面试篇基础部分-Java各种垃圾收集器
在之前的分享中,我们知道Java堆内存被分为新生代和老年代两个部分;其中,新生代中主要存储生命周期较短的对象,了解了新生代中的对象采用的是复制算法进行垃圾回收;而老年代主要存储生命周期较长的对象以及大对象,采用的是标记整理算法进行垃圾回收。针对不同的分代对于新生代和老年代主要有如下的一些垃圾收集器,新生代的有Serial、ParNew、Parallel、Scavenge,老年代主要有SerialOld、Parallel Old、CMS,还有针对不同区域的G1分区收集算法等等。如图所示。
2024-09-10 11:34:57 1072
原创 Java面试篇基础部分-垃圾回收算法
就是再Java中对象的使用方式被写成一个环的形式。三个对象之间相互引用,这个时候如果使用引用计数来判断的话,A、B、C三个对象都不能被回收调为了解决这个问题,就出现了可达性分析。也就是定义了一个根搜索算法(GC Roots Tracing)来实现。通过一系列的GC Roots的点作为起点,进行深度优先遍历。在一个对象到任何的GC Roots都没有引用链相连的时候,说明这个对象已经死亡。那么怎么解决上面的问题呢?
2024-09-10 08:38:32 1183
原创 Java面试篇基础部分-JVM内存运行时机制
JVM运行时内存也就是上篇文章中说到的Java堆内存,从GC的角度上,可以将堆内存分为新生代、老年代和永久代。从JDK1.8之后,将永久代用元数据区替换,但是所存在的功能与永久代功能类似,可以被看做是永久代。新生代内存默认占用堆内存的1/3空间,老年代默认占用2/3空间,永久代也就是元数据区占用的空间非常少。新生代又分为了Eden区、ServivorFrom区和ServivorTo区,Eden区默认占用了8/10新生代的空间,From区和To区分别占用了1/10的新生代空间。
2024-09-07 11:54:53 919
原创 Java面试篇基础部分-JVM详细介绍
操作系统负责的是所有线程的调度,并且操作系统为每个线程分配CPU时间片,在操作系统初始化完成之后,就会调用Java线程操作中的run()方法执行该操作,在线程结束之后,会释放所有的对应的资源。在JVM运行过程中创建的对象和产生的数据都被存储在堆内存中,堆内存是一个被线程共享的内存区域,也是垃圾收集器进行垃圾回收的主要的内存区域。栈帧用来记录方法的执行过程,方法在被执行的时候虚拟机会为其创建一个与之对应的栈帧,方法的执行和返回对应栈帧的虚拟机栈中中的入栈和出栈操作。如图所示,展示了线程运行及栈帧变化的过程。
2024-09-07 11:35:33 1293
原创 Dependencies与DependencyManagement的区别
中jar直接加入到项目中,管理的是依赖关系(如果有父级pom,子级pom,则子级pom中只能被动接受父级的版本);主要管理版本,对于子类继承同一个父类是很有用的,集中管理依赖版本不添加依赖关系,对于其中定义的版本,子pom中不一定继承父级pom中的所有版本。
2024-09-07 11:23:24 944
原创 深入理解java并发编程之aqs框架
JUC中的同步器三个主要成员:CountDownLatch、CyclicBarrier和Semaphore,通过它们可以方便的实现很多线程之间的协助功能。CountDownLatch叫倒计数,允许一个或者多个线程等待某些操作完成。跑步比赛,裁判需要等到所有运动员都跑到终点才能计算成绩。模拟并发,需要启动100个线程同时访问某个地址,希望他们能并发执行而不是一个一个执行。
2024-09-07 09:14:50 1234
原创 深入理解synchronized的原理是什么
可重入性是锁的基本要求,是为了解决死锁的情况发生。如图所示,在一个类中同步调用了另一个同步方法,假如synchronized不支持重入,进入method2的时候当前线程获取锁,method2中又执行了method1的时候当前线程又要尝试获取锁,这个时候如果不支持重入,那就要等待释放,所以自己获取锁,自己等释放,就会导致死锁。对于synchronized来说,重要性是显而易见的。
2024-09-06 08:49:17 919
原创 从单体架构到微服务架构的演变,微服务带来的挑战是什么?
这与SOA中的服务的拆分粒度是不同的。随着业务的发展支持微服务的组件也会越来越多,导致微服务之间的调用关系原来越复杂,同时服务之间的通信问题也就会变得复杂,难以管理,然后再要考虑到重试、容错、服务降级等情况。现在很多的公司都是有适合自己公司的一套技术体系的东西,就算是使用了开源的中间件,后期也会因为业务的需求进行定制化的开发,毕竟很多的东西,总结出来只是普适性的内容。微服务是一种服务化的实现思想。虽然本身有很多的优势的地方,但是在使用过程中,经常会遇到分库分表,API交互,大量的微服务的运维与开发等问题。
2024-08-28 14:46:30 1004
原创 在使用Netty的时候TCP粘包拆包问题如何解决?
这些代码示例展示了如何在 Netty 中使用不同的解码器来解决 TCP 粘包和拆包问题。选择合适的解决方案取决于具体的应用场景和通信协议。通常情况下,消息定长和消息分隔符是比较常用和简单的解决方法,而消息头部长度表示则提供了更为灵活的方式来处理不同长度的消息。Netty 提供的解码器则是在实际开发中常用的工具,可以有效地解决 TCP 粘包和拆包问题。
2024-08-28 11:04:29 737
原创 如何监控Spring Boot 项目运行情况?
在实际开发中,经常会遇到想要获取到服务器应用的运行情况的场景。在微服务架构下对于每个应用运行情况的监控是保证系统高可用的关键。
2024-08-28 10:42:32 918
原创 什么是springboot?一文带你读懂springboot
Spring Cloud 是基于Spring Boot框架提供的一系列的微服务的解决方案集合,有配置中心、服务注册、负载均衡等等。这些开发都是在Spring Boot的基础上进行封装。从这个角度上来看Spring Boot可以看做Spring Cloud的基础。那么到底什么是Spring Boot 呢?首先Spring Boot是一个基于Spring来开发出来的Spring生态下的快速开发解决方案,在Spring 框架中讲究的是约定大于配置。
2024-08-28 10:27:24 768
原创 MySQL中如何删除重复数据?
在MySQL中删除重复数据是一个常见的需求,特别是在处理大型数据库时。删除重复数据可以通过多种方式实现,具体方法取决于你的具体需求和数据库的结构。以下是一些常见的方法。
2024-08-28 08:50:29 486
原创 Vue2实现动态创建表单并进行存储,在其他地方直接加载对应的表单进行数据填报操作?
emsp&esmp;提供一个界面让用户输入表单字段,保存到本地存储或发送到服务器。
2024-05-23 15:46:21 1212 1
SpringBoot+LayUI理发店会员管理系统
2024-08-28
springboot+vue汽车租赁管理系统
2024-05-24
Java Swing 实现简单的计算器
2024-05-09
Python实现2048小游戏源码
2024-05-09
毕业设计-学生请假管理系统
2024-05-09
毕业设计-大学生校园失物招领系统
2024-05-09
基于SpringBoot+LayUI实现仓库管理系统毕业设计
2024-04-02
SpringBoot+JPA+Vue2实现的学校实验室管理系统
2024-03-31
基于SpringBoot+LayUI+Vue实现的自习室预约管理系统毕设
2024-03-28
CTF-反编译相关资料
2024-03-11
CTF-培训Crypto、Misc专题PDF
2024-03-11
Windows、Mac、Linux 全平台JDK17安装包
2023-09-24
基于Android技术开发的毕业设计APP
2022-10-18
一个炫酷的抽奖系统源码
2022-06-28
Spring Boot 整合 Netty + WebSocket 实时消息推送
2022-03-14
Android课设.zip
2021-02-28
基于JAVA的选课管理系统(精简版)
2021-02-28
基于JAVA的图书管理系统(精简版)
2021-02-28
JAVA毕设-学生选课管理系统
2021-02-28
安装虚拟机出现这个问题?
2017-02-25
做了一个简单的opencv2.fromwork的测试但是出现了这个问题
2016-12-06
Linux网络配置报错unrecognized service
2016-11-16
怎么解决问题也出现这个问题么Linux IP配置的
2016-11-10
遇到LinuxIP配置新问题求解答
2016-11-10
刚刚开始学习Linux的网络配置遇到这个问题
2016-11-09
新安装的vs2013出现了下面的问题(用红色圈起来的)
2016-10-28
orcl安装好了以后出现这个问题
2016-10-26
IIS服务器配置好以后怎么通过连接它的电脑上传文件?
2016-10-14
怎么让外网上访问本地服务器
2016-10-13
有一个关于html数据流的问题
2016-09-22
xampp下的Apache在那设置本地文件HTML文件
2016-09-22
怎么在本地把文件上传到本地服务器
2016-09-21
github客户端的的使用方式
2016-09-20
Linux系统的iOS文件在哪里找啊
2016-03-13
c语言结构体方面的问题
2015-11-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人