自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 探秘 Spring IoC

前言:在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”,目前这个理论已经被成功地应用到实践当中,很多的J2EE项目均采用了IOC框架产品Spring。一. 什么是控制反转(IoC

2020-08-11 20:18:18 175

原创 探秘 Spring AOP到底是JDK 还是 CGLib动态代理(源码分析)

一、什么是AOP?与OOP相比,面向切面,传统的oop开发中的代码逻辑是至上而下的,在这个过程中 会产生一些横切性的问题,会散落在代码的各个角落中,造成难以维护,耦合度高,aop编程思想就是将这些散落的代码分离出来,独立的封装出来,达到解耦的目的,提高代码的重用性和效率。在日常的软件开发中,拿日志来说,一个系统软件的开发都是必须进行日志记录的,不然万一系统出现什么bug,你都不知道是哪里出了问题。举个小栗子,当你开发一个登陆功能,你可能需要在用户登陆前后进行权限校验并将校验信息(用户名,密码,请

2020-08-11 19:50:33 1332

原创 JVM--类加载机制与类加载器

类的加载机制运行期类加载。即在语言里面,类型的加载、连接和初始化过程都是在程序运行期完成的,从而通过牺牲一些性能开销来换取Java程序的高度灵活性什么是运行期,什么是编译期?编译期是指编译器将源代码翻译为机器能识别的代码,Java被编译为Jvm认识的**字节码文件,运行期 则是指Java代码的 运行 过程。JVM运行期 动态加载 + 动态连接 -> Java的动态扩展特性类加载的生命周期:1.加载加载阶段虚拟机完成的事:通过类的全限定名来获取定义此类的二进制字节流。将该二进制

2020-08-03 21:27:48 272

原创 复习:Map面试基础笔记 (狂虐HashMap)

Map采用了 Key-value键值对映射的方式进行存储1 key在Map里面是唯一的但是value可以重复一 个key对应一个value。2 key是无序、唯一的3 value是无序不唯一的HashMap(重中之重)查找 时间复杂度都要小,无限接近O(1)是可以序列化的是线程不安全的底层主要是基于数组和链表实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储位置的。(这里本人之前也有过简单的HashMap简介可以了解下:https://blog.c

2020-07-27 22:42:14 214

原创 layui前端+springboot框架--商品绑定多个分类代码

直接上效果图:通过选择框选择自己想要绑定的多个分类!上干货:<div class="row cl"> <label class="form-label col-xs-2 col-sm-2"><span class="c-red">*</span>绑定分类:</label> <...

2020-04-27 15:47:46 643

原创 SpringBoot售卖物品操作核对数据库信息,并实现增删改查

问题描述:这里是实现了对卡卷的发售,并且判断数据库表中是否存在该代理,该代理是否已经拥有该类卡卷。如果有则对数据进行修改,如果没有该类卡,那么加入一条该代理的该类卡卷的新数据。如果没有该代理,则加入新的代理信息和该类卡卷信息,形成一条新数据。@PostMapping("sale") @ResponseBody public AjaxResult sale(Ticket ti...

2020-02-11 23:26:13 380

原创 HashMap简介

HashMap简介在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。适用场景:读多写少,(读取多插入少)一般场景 --》 一次写入,剩下全读。读取速度最快的,是根据下标读数组,时间复杂度O(1) ,但是插入速度...

2020-01-26 18:22:48 384

原创 算法 敏感词替换 最简单的暴力解法(欢迎大佬指点)

题目描述: 考虑实现一个敏感词过滤的功能,给定指定的敏感单词、句子、替换词,把句子中的敏感单词词全 部替换成替换词。注意替换过程中敏感词需要忽略字母顺序,例如lyou这个敏感词,句子里如果出现oyu、uyo等,也同样需要进行替换,以免有人利用不影响人类理解的错误字母顺序钻空子。输入描述输入为三行内容:第一行是数感单词第二行是待检测的句子第三行是替换的目标词输出描述输出替换好数感词的句子输入:youi love you,ouy love mejack输出:i love .

2020-09-10 11:31:59 1267

原创 算法-密码类型数量校验java实现

注册网站时,需要使用包含不同类型(数字、符号、大写字母、小写字母)的字符,和特定长度。检查—个密码内容同时包含以上4种类型的字符,并且长度在8-120个字符之间。符合要求,返回0;长度不符合返回1;类型不符合要求返还2.可以—次输入多组密码,以空格符间隔,空格符不作为度码。输入样例123 12345678 123abcABC!!!输出样例120import java.util.Scanner;public class Main3 { //密码校验 public stati

2020-09-09 10:45:02 318

原创 DNS域名解析流程图(详细)

https://www.processon.com/view/link/5e368ed3e4b0d27af184e626 看不清的话点这里。

2020-09-08 10:31:07 2153

原创 HTTP的进化历程与HTTPs的区别

HTTP早在 HTTP 建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的HTML页面将要放在我们的 web 服务器上,用户端通过浏览器访问url地址来获取网页的显示内容,但是到了 WEB2.0 以来,我们的页面变得复杂,不仅仅单纯的是一些简单的文字和图片,同时我们的 HTML 页面有了 CSS,Javascript,来丰富我们的页面展示。当 ajax 的出现,我们又多了一种向服务器端获取数据的方法,这些其实都是基于 HTTP 协议

2020-08-24 21:56:37 240

原创 深入浅出-MySQL,到底什么是MySQL,它是怎么实现的?

什么是MySQL?MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。(悄悄告诉你,虽然咱们用的和阿里用的都是MySQL但是人家的是经过“改装的”哦)MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。查看MySQL提供的所有存储引擎mysql&g

2020-08-24 21:04:24 946 2

原创 接口与抽象类的区别--面试常问

接口与抽象类的区别的小视频

2020-08-19 10:53:52 217

原创 ArrayList 在循环时候调用remove()方法 合法吗?

1 正向循环删除的时候由于删除完一个元素后会进行元素移动,如果有一样的元素,会漏删第二个一样的元素。for循环正向删除,会遗漏连续重复的元素。2 反向循环删除不会出现漏删情况,并且多线程安全。总结:反向遍历删除,没有问题(单线程+多线程)。3 使用迭代器删除,如果调用List的remove()方法,会抛出异常,通过迭代器的源码解析,发现是由于删除后ModCount会增加 但expectedModCount不会增加这样在下边方法判断中就会由于这两个参数不相等而抛出异常。Iterator调用Array.

2020-08-16 10:29:33 459

原创 Java并发工具包-countDownLatch,同步屏障CyclicBarrier,控制并发线程数的Semaphore (信号量)

1 countDownLatchcountDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。如果有某个解析sheet的线程处理得比较慢,我们不可能让主线程一直等待,所以可以使用另外一个带指定时间的await方法——await(long time,TimeUnit unit),这个方法等待特定时间后,就会不再

2020-08-16 10:25:59 307

原创 MySQL索引总结,面试总会出现的题。

MySQL索引MySQL索引使用的数据结构主要有BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。MySQL的BTree索引使用的是B树中的B+Tree,但对于主要的两种存储引擎的实现方式是不同的。MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 d

2020-08-13 22:28:59 241

原创 我对线程的理解与总结

什么是线程线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。线程也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。

2020-08-13 22:06:48 409

原创 深入浅出SpringMVC---面试宝典

SpringMVC 简单介绍SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口。看一下什么是 MVC 模式MVC 是一种设计模式.MVC 的原理图如下:SpringMVC 使用需要在 web.xml 中配置 DispatcherServlet 。 并且需要配置 Spring监听器ContextLoaderL

2020-08-13 20:56:31 153

原创 单例模式也有坑-快进来看看

饿汉式一般饿汉式加载所导致的弊端是可能我并不想使用实例但是实例已经被构造,相对于懒汉式的用则构造会造成内存的浪费,但是其实现方式很简单//饿汉式单例public class Hungry { //如此操作可能会浪费空间 private byte[] data1 =new byte[1024*1024]; private byte[] data2 =new byte[1024*1024]; private byte[] data3 =new byte[1024*1

2020-08-12 22:15:01 231 1

原创 浅析-SpringBean

前言在 Spring 中,那些组成应用程序的主体及由 Spring IOC 容器所管理的对象,被称之为 bean。简单地讲,bean 就是由 IOC 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了。而 bean 的定义以及 bean 相互间的依赖关系将通过配置元数据来描述。Spring中的bean默认都是单例的,这些单例Bean在多线程程序下如何保证线程安全呢?例如对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Servlet线程来处理请求,引入

2020-08-10 22:17:47 180

原创 Condition接口示例与实现分析

Condition – 条件任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。换而言之,synchronized关键字想要实现等待/通知模式,需要调用以上的四种方法。然后我们的Condition接口也提供了能够实现等待/通知模式,是与Lock配合实现的。但是二者在使用方式上以及功能

2020-08-07 22:38:24 317

原创 LockSupport工具

当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应工作。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。Park有停车的意思,假设线程为车辆,那么park方法代表着停车,而unpark方法则是指车辆启动离开,这些方法以及描述如表所示。..

2020-08-06 22:41:39 146

原创 Lock接口与队列同步器AQS

Lock接口与synchronized锁对比在Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性使用synchronized关键字将会隐式地获取锁,但是它将锁的获取和释

2020-08-06 22:24:01 160

原创 happens-before详解

happens-before是JMM最核心的概念。对应Java程序员来说,理解happens-before是理解JMM的关键。(对于做好程序员来说,理解世间万物都是关键)首先,从JMM设计者的角度,在设计JMM时,需要考虑两个关键因素。程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码。编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越好,这样它们就可以做尽可能多的优化来提高性能。编译器和处理器希望实现一个弱内存模..

2020-08-06 12:51:59 1806

原创 concurrent包的实现

由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现在有了下面4种方式。1)A线程写volatile变量,随后B线程读这个volatile变量。2)A线程写volatile变量,随后B线程用CAS更新这个volatile变量。3)A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。4)A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。Java的CAS会使用现代处理..

2020-08-06 12:30:36 264

原创 volatile的内存语义

前言当声明共享变量为volatile后,对这个变量的读/写将会很特别。为了揭开volatile的神秘面纱,下面将介绍volatile的内存语义及volatile内存语义的实现。volatile的应用与底层原理详见:《volatile的应用与底层原理》volatile的特性理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。下面通过具体的示例来说明,示例代码如下。class VolatileFeaturesExampl

2020-08-06 12:01:38 411

原创 处理器(CPU)是如何实现原子性操作的?总线锁与缓存锁

处理器如何实现原子操作(1)使用总线锁保证原子性第一个机制是通过总线锁保证原子性。如果多个处理器同时对共享变量进行读改写操作(i++就是经典的读改写操作),那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致。举个例子,如果i=1,我们进行两次i++操作,我们期望的结果是3,但是有可能结果是2,如图所示。原因可能是多个处理器同时从各自的缓存中读取变量i,分别进行加1操作,然后分别写入系统内存中。那么,想要保证读改写共享变量的操作是原子的,就

2020-08-05 21:59:53 3741 4

原创 Java如何实现原子操作--CAS与锁机制

使用循环CAS实现原子操作JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止.那么什么是CAS呢?CAS的定义一个线程失败或挂起并不会导致其他线程也失败或挂起,那么这种算法就被称为非阻塞算法。而CAS就是一种非阻塞算法实现,也是一种乐观锁技术,它能在不使用锁的情况下实现多线程安全,所以CAS也是一种无锁算法。CAS [公式] 比较并交换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技

2020-08-05 21:35:51 443

原创 synchronized的实现原理与应用

在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。下面详细介绍Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下3种形式。* 对于普通同步方法,锁是当前实例对象。* 对于静态同步方法,锁是当前类的Cla

2020-08-05 21:20:40 158

原创 浅析Java内存模型

Java内存模型的抽象结构Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示

2020-08-05 09:57:40 115

原创 共享锁和排他锁以及乐观锁

共享锁如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。排他锁排他锁(X锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突)乐观锁乐观锁不是数据库自带的,需要我们自己去实现。乐观锁是

2020-08-05 08:34:15 636

原创 volatile的应用以及底层实现原理

volatile的定义Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。排他锁又称写锁,当某个资源被上排他锁时,只能有一个线程占用,其他线程如果想要访问该资源只能等待。在了解volatile实现原理之前,我们先来看下与

2020-08-05 08:27:23 474 1

原创 死锁问题详解

锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可 用。让我们先来看一段代码,这段代码会引起死锁,使线程t1和线程t2互相等待对方释放锁。public class DeadLockDemo { private static String A = "A"; private static String B = "B"; publi

2020-08-04 23:04:32 1336

原创 并发编程----上下文切换

前言:即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。什么是上下文切换?CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。举个例子:.

2020-08-04 22:11:35 260

原创 仿写Servlet,实现servlet原理(涉及反射)

个人码云:https://gitee.com/zzz444/imitateServlet/可以克隆下载学习;目录结构package com.james.test;import com.james.interfaces.HttpServlet;import com.james.interfaces.WebServlet;@WebServlet("/test")public class TestMyServlet implements HttpServlet { @Override

2020-08-03 14:09:30 314

原创 现代最前沿成果之一---G1垃圾收集器器详解

G1是什么?

2020-08-02 10:24:21 789

原创 面试官99.99%会严刑拷打的几种垃圾收集器,各自的优缺点,包括原理,流程,优缺点。

1)几种垃圾收集器:Serial收集器: 单线程的收集器,收集垃圾时,必须stop the world(即只运行GC线程,暂停所有用户线程),用户体验感不好,使用复制算法,但是并未过时,到现在为止,依然是虚拟机运行在Client模式下的默认新生代收集器。ParNew收集器: Serial收集器的多线程版本,实际上与Serial收集器共用了很多代码,也需要stop the world,使用复制算法。Parallel Scavenge收集器: 新生代收集器,复制算法的收集器,并发的多线程收集器

2020-08-01 22:27:55 261

原创 为什么有full GC还会发生oom(OutOfMemoryError)

JVM 有fullGC为什么还会出现oom(OutOfMemoryError)?既然在触发full gc的时候,年老代和持久代都会被清理,那么为什么还会出现oom问题?而且对于强引用,当内存空间不足,java虚拟机宁愿抛出oom错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题;那么full gc机制的存在有何意义?还是说fgc主要针对的是驻扎在老年的的软引用? 既然如此,对于四种引用的方式如何抉择?总不能所有对象都创建引用队列使用软引用或弱引用吧?举个栗子:为什么我请了佣

2020-08-01 21:15:23 2339

原创 JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,Minor GC、Major GC和Full GC之间的区别

一、可达性分析算法(GC Roots)有一种引用计数法,可以用来判断对象被引用的次数,在任何某一具体时刻,如果引用次数为0,则代表可以被回收。这种实现方式比较简单,但对于循环引用的情况束手无策,所以 Java 采用了可达性分析算法。即判断某个对象是否与 GC Roots 的这类对象之间的路径可达,若不可达,则有可能成为回收对象,被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。具体详情可以看我另外一

2020-08-01 20:47:31 12200

转载 什么情况下会发生堆内存溢出,栈内存溢出,结合实例说明

转载自:https://blog.csdn.net/qq_31615049/article/details/82980799一、 栈溢出(StackOverflowError)栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口灯信息。局部变量表又包含基本数据类型,对象引用类型(局部变量表编译器完成,运行期间不会变化)所以我们可以理解为栈溢出就是方法执行是创建的栈帧请求的深度超过了栈能给予的最大深度。最有可能的就是:方法

2020-08-01 20:06:08 2089

空空如也

空空如也

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

TA关注的人

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