自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 git的使用

序言hello,大家好,好久不见,前段时间学习了一下git,于是乎有了今天这篇文章,可能对于学生来说git所占的分量没有编码那么足,但对于即将工作的我来说,git还是很重要的,在今后的工作中是离不开git的,下面我们就一起来学习一下吧。git是什么git是一款分布式的版本管理工具那什么是版本管理工具呢?顾名思义版本管理工具,就是用来管理我们的版本的,每个学生都会经历论文答辩这么一个环节,当然百分之99的学生的论文都是需要经过一次次的修改最终才能定型的,那么这一次次的修改对应的论文,就可以看作是

2021-02-20 11:28:26 241

原创 读了这篇文章,再也不怕面试问起ThreadLocal了

序言ThreadLocal在日常开发中还是比较常见的,本文将从源码的角度彻底揭秘ThreadLocal,并会分享一些较为常见的面试题,let’s go。最近新开通的公众号:GuoCoding,还望各位小伙伴关注支持一波~ThreadLocal是什么?ThreadLocal隶属于lang包,它的主要功能是为每个线程提供一个私有的局部变量,这个变量在线程间相互隔离,互不影响。主要解决的就是单例情况下全局变量的线程安全问题ThreadLocal的底层实现set方法 public void se

2021-02-20 11:27:30 292

原创 面试必备的排序算法

序言相信大家一定有听说过排序算法,在笔面试时也经常会有关于排序的问题,今天我们一起学习回顾常见常用的排序算法吧。下面我们先看张图:这张图介绍了各个排序的时间复杂度和空间复杂度,大家一定要牢固掌握。对数器在介绍这些算法之前,我们可以先引入一个对数器的概念,对数器的作用就是为了验证我们的排序算法结果是否正确。实现原理:产生很多随机数,通过正确的排序算法对其进行排序,然后用我们自己的算法进行排序,校验两次排序结果是否相同来验证算法是否正确,同时为了确保算法的正确性,我们可以对其进行多次循环。即便如

2021-02-20 11:26:57 215

原创 我决定手写一个MyBatis

序言hello,大家好,现在放假了,在家闲来无事准备手撸一个MyBatis框架,现在的进度:刚写完select语句的查询支持,包括注解和配置文件的形式,大家有什么好的意见或者不懂的地方欢迎留言讨论。Mybatis是什么相信学习JAVA的小伙伴,都接触过JDBC,JDBC为我们提供了JAVA操作数据库的接口,不过由于JDBC的API太过繁琐,我们每次都要做大量的相同的操作,并且还要对执行sql语句过程中所出现的各种异常和资源释放进行处理,而真正涉及到业务功能的代码其实很少,这明显影响了我们开发的效率。

2021-02-20 11:26:20 134

原创 栈和队列

序言hello,大家好,今天我们聊一聊栈和队列,大二学数据结构时候,第一次接触到栈和队列,不知不觉到现在两年时间了,不得不感叹一句时间如流水,青春不回头啊~栈和队列的概念栈栈,是一种后进先出的数据结构,上图看一下可以看到对于先进来的元素是压入栈底的,后进来的元素则放到栈顶,出栈时先出栈顶元素,这样就可以构成后进先出的数据结构了。队列队列,是一种先进先出的数据结构,上图~将1,2,3元素依次入队,队头元素为1,队尾元素为3,出队时先出队头元素,对于后入队的元素将其放置到队尾即可。用栈实现

2021-01-08 22:01:51 106

原创 全面剖析分布式锁

序言今天一起学习下分布式锁,分布式锁常见于集群环境下,用于做一些单机锁无法解决的问题,比如扣减库存的场景,如果扣减库存的业务机器是多台部署的就会出现超卖现象(JAVA中常见的lock和Synchronized都属于单机锁),此时就需要引入分布式锁了。分布式锁的实现有很多种,最为常见的是通过redis实现和zookeeper实现,今天我们通过redis来实现一下分布式锁吧。分布式锁redis实现分布式锁,那么我们不妨思考如何用redis实现呢,条件为:这个操作是互斥的,redis中正好有一条指令可以实

2020-12-20 13:10:25 96

原创 Volatile究竟有什么用?

序言hello,大家好,昨天顺利收到了满意的offer,也算是为今年秋招画上一个完美的句号了。今天我们一起来聊一聊Volatile这个关键字,Volatile可以保证数据在多线程环境下的可见性,禁止指令重排,但它无法保证数据的原子性。可见性多线程之间为什么会出现可见性问题?按理来说,多个线程对我们内存中的同一个数据做操作,因为是直接操作数据所以不应该出现可见性的问题呀,那这是怎么产生的呢?原来随着计算机的不断发展,CPU与内存之间的速度差距越来越大,为了解决这个问题,我们在CPU当中引入了高

2020-12-16 15:49:37 150

原创 学习笔记:操作系统

序言今天想简单写一些操作系统相关的知识,大二也学过操作系统,但由于年代有些久远、自己记忆力也不好导致很多知识都有遗漏,今天写篇笔记来巩固一下知识操作系统的作用进程管理、文件管理、内存管理、设备管理什么是进程、线程、协程进程:进程即我们程序的一次执行,进程是操作系统用于分配资源和调度的基本单位。线程:线程是比进程更小的单位,一个进程可以包括多个线程,而一个线程只能隶属于一个进程,同一进程下的多个线程共享该进程下的堆和方法区,同时它们也都有自己的程序计数器,本地方法栈和虚拟机栈。协程:协程是一种

2020-12-14 19:02:47 107

原创 深度剖析LRU

序言今天我们一起来剖析一下LRU算法,在Redis中当内存满了后,有一种内存淘汰策略就是LRU即淘汰掉最近最少使用的数据。我们不妨先思考一下,什么样的数据结构可以满足上述条件,对我们可以使用队列,最近使用的数据放在队尾,淘汰数据时淘汰掉队头的数据即可,我们可以使用一个双向链表来表示成一个队列。LRU实现方法一很巧妙的是JAVA中有一个类可以完美契合LRU算法,那就是LinkedHashMap,我们可以使用LinkedHashMap来实现LRU。代码如下:class LRUCache<K,V

2020-12-06 10:22:48 200

原创 JUC常用的并发包

序言:JUC也就java.util.conCurrent的简称,基本上JAVA中涉及到多线程的类都是在这个包下的。JUC包下的大多组件都是基于AQS基类的,今天我们简单聊一下JUC下的三大类CountDownLatch,CyclicBarrier,SemaphoreCountDownLatchCountDownLatch的中文意思就是倒计数器,通过构造函数来指定计时器的大小,下面通过一段代码来演示一下! CountDownLatch countDownLatch=new CountDownLat

2020-12-04 08:55:59 869 1

原创 RabbitMQ的死信队列

序言浅谈一下消息队列,随着分布式架构的不断发展,消息队列也逐渐走进到程序员的“生活“中来,在一些特定的业务场景下消息队列是个相当不错的选择。消息队列的作用(它究竟能做什么)服务解耦何为服务解耦?下面我说一个例子大家体会一下,比如说我现在有一个订单系统,订单创建成功之后会做一系列的事情,比如创建物流信息啊,增加用户的积分之类的操作,我们可以使用传统的方式通过RPC来远程调用一下这些服务,这种方式看起来没啥问题,但随着业务的增加就会发现它的不足了。问题的产生此时如果业务发生改变,需要在订单创建成功后

2020-11-26 19:09:24 329

原创 学习笔记:AQS

序言好久没有写文章了,最近太懒了哈哈,今天督促自己写一下AQS的学习笔记吧,因为前段时间刚温习了一遍。AQSAQS全称是:AbstractQueuedSynchronizer(抽象的队列同步器),它隶属于我们的JUC包,可以说AQS就是并发类的基类/规范了,很多类都是基于AQS实现的:lock锁,CountDownLatch,CyclicBarrier,Semaphore了。AQS的工作原理:当有线程来获取共享资源时,如果共享资源处于空闲状态,那么该线程就设置为工作线程,共享资源设为锁定状态,如果线

2020-11-05 23:58:55 682

原创 Linux常用命令

序言作为后端开发,我们对Linux肯定是不陌生的,Linux作为服务器的话相较于Windows会有一个安全性的保证,因为大量的木马病毒是无法在Linux上执行的,Linux不支持.exe的文件。目前Linux主要是发布了两大版本,分别是:一:(redhat,centOS,fedora,turboLinux)二:(ubuntu,debian)我们一般最常用的还是红帽子的CentOS系列了,今天就记录下CentOS上简单的命令。工具vmWare:使用vmWare工具可以让我们快速方便的使用L

2020-10-27 09:45:27 240

原创 学习笔记:Synchronized的底层探索

序言今天来聊一下synchronized这个关键字吧,它是一个非公平的互斥锁。synchronized可以添加在方法上或者代码块上。当添加在普通方法上时添加的是对象锁,当添加在静态方法上时添加的是类锁。synchronized可以保证在并发情况下的线程安全,以及其它一些特性:原子性:synchronized是互斥的所以说同一时间只会有一个线程在执行所以说保证了原子性可见性:线程在获取了锁之后,会去主内存中获取最新的值,这就保证了可见性禁止指令重排:我们知道计算机为了提高效率会更改我们的代码执

2020-10-23 00:02:12 111

原创 学习笔记:线程池~

序言今天呢来介绍一下线程池,池化技术相信大家已经不陌生了,它产生的主要目的就是为了提高程序的响应速度,以及对资源的复用。初识线程池在我们的juc包下有一个类Executors,通过这个类可以很快速的创建出线程池Executors.newFixedThreadPool(n):创建一个带有n个线程的线程池Executors.newSingleThreadExecutor();创建一个只有一个线程Executors.newCachedThreadPool();创建一个线程个数为Integer.MAX

2020-10-23 00:01:40 79

原创 学习笔记:分布式锁

序言hi,大家好~刚看完s10比赛,恭喜SN3:1战胜JDG,今天我们聊一下分布式锁,希望大家可以点个赞支持一下O(∩_∩)O分布式锁的产生:随着互联网的发展,单体架构无法满足需求,从而扩展成分布式架构后解决分布式情况下同步问题所产生的技术。为什么分布式情况下要使用分布式锁来解决同步问题呢?我们知道在程序中是离不开线程安全的,在单体架构下我们可选择的解决线程安全的方案有很多,最常见的就是使用互斥锁来解决,但在分布式集群环境下,使用常规的互斥锁例如:synchronized,lock是无法控制多台机

2020-10-23 00:01:08 111

原创 学习笔记:分布式锁

序言hi,大家好~刚看完s10比赛,恭喜SN3:1战胜JDG,今天我们聊一下分布式锁,希望大家可以点个赞支持一下O(∩_∩)O分布式锁的产生:随着互联网的发展,单体架构无法满足需求,从而扩展成分布式架构后解决分布式情况下同步问题所产生的技术。为什么分布式情况下要使用分布式锁来解决同步问题呢?我们知道在程序中是离不开线程安全的,在单体架构下我们可选择的解决线程安全的方案有很多,最常见的就是使用互斥锁来解决,但在分布式集群环境下,使用常规的互斥锁例如:synchronized,lock是无法控制多台机

2020-10-16 23:31:43 200 1

原创 设计模式:动态代理

序言动态代理,是十分常见的,Spring著名的AOP就是基于动态代理实现的,今天我们来学习一下动态代理叭。代理代理可以分为两大类:动态代理和静态代理区别:静态代理在编译时增强,动态代理在运行时增强静态代理的CODE//接口:interface Teacher{ void teach();}//接口的实现:class GoodTeacher implements Teacher{ @Override public void teach() { Sys

2020-10-15 23:52:24 139

原创 设计模式:七大原则

序言设计模式的设计需要遵循一定的原则,下面我们就简要的用白话说一下这七大原则。七大原则单一职责原则从细粒度来说,单一职责就可以理解为,一个接口或者一个方法只做一件事,不要做与当前业务无关的事。从广度来说,微服务中的每一个服务都只做与当前服务有关的业务,不涉及其他服务的业务。接口隔离原则所谓接口隔离可以理解为,当前类实现了一个接口,接口中共有4个方法,而当前类只需要用到其中的2个方法,这样就可以把接口拆分成开来。(接口尽量细化,接口中的方法尽可能的少)依赖倒转原则即面向接口编程,抽象不要依赖

2020-10-15 08:12:53 82

原创 设计模式:单例模式

序言今天呢,来说一下设计模式吧,一个强大且高效的设计模式,可以大大提高代码的可读性,保证我们代码的可靠性也会提高程序的效率,毫无疑问使用设计模式来优化程序十分重要,但我们光会用可不行,一定要知其然知其所以然,这样才能学习到其中的核心思想,今天说一下设计模式中的单例模式吧!单例模式单例模式:顾名思义,使用单例模式会保证我们的类只有一个实例。设计步骤保证类只有一个实例构造函数私有化对外提供一个获取实例的方法单机模式下的单例:懒汉式class Singleton { priva

2020-10-14 08:18:18 122

原创 面试系列:大厂笔试题

序言今天和大家分享几道我亲身经历的大厂笔试题,求个赞O(∩_∩)O,话不多说直接开始吧(今天湖人夺冠了太开心了, Kobe,this is for you!)阿里巴巴第一题:采用多线程的方式,分别按顺序打印A,B,C,共打印10次第二题:经典爬楼梯问题,小明上楼梯可以一次上1个台阶或2个台阶,问小明上到N个台阶,共有多少种爬法字节跳动第一题:题目描述:数组A,2*n个元素,n个奇数、n个偶数,设计⼀个算法,使得数组奇数下标位置放置的都是奇数,偶数下标位置放置的都是偶数要求时间复杂

2020-10-12 20:57:31 2281

原创 面试系列:蘑菇街面经

序言说起来也是一段难忘的经历,就在不久前参加了蘑菇街的秋招,最终倒在了2面。。。自己也收获了许多最终决定将这次经历分享给大家,在这儿求个赞!(#.#)投递简历简历真的是非常重要的,它就相当于我们的敲门砖,首先自己得有足够的项目经验,再者找一个好模板也非常重要。我在写简历的时候也参考了很多github上的简历。https://github.com/apachecn/Interview(附上一个链接)我是通过朋友内推的方式投递到的蘑菇街,一个星期后收到了一面的邀请。。。一面当时正在教室上课,面

2020-10-12 20:56:36 563

原创 学习笔记:MySql

MYSQL基础知识:sql注入:当sql语句绑定有参数输入时,可通过外部更改URL的方式,将sql语句进行更改(union),这样就可以在未获取正确数据的情况下访问系统,对系统的安全性造成破坏mybatis如何在插入数据后获取主键值:xml中useGeneratekeys属性设置为true数据库中间件技术:mycat,当mysql设为集群架构时,项目连接mycat,mycat连接mysql集群,这样项目就感觉直接连了一个mysql,而不是mysql集群。sql执行的步骤:from join

2020-10-12 20:55:25 117

原创 学习笔记:JVM的底层挖掘

JDKjdk是JAVA开发工具包,包含了各种JAVA类库JRE是JAVA运行时环境通过它才能将开发的程序发布到用户手中JVM是JAVA虚拟机(JVM是个标准,它的实现有HotSpot虚拟机)所有程序编译为.class文件后才可以再虚拟机上运行JDK包括JRE,JRE包括JVM并行和并发的区别:并发是指一个时间段内有两个及以上的程序执行并行是指一个时刻内有两个及以上的程序执行java跨平台:windows平台使用的是Intel汇编,unix平台使用的是AT&T汇编,还有一种汇编是AR

2020-10-12 20:54:09 395

原创 学习笔记:hashmap+concurrentHashMap的底层挖掘

HashMap它是JAVA中的一个集合框架通过key value的方式存储数据最大容量为:1<<30 2的30次方jdk1.8后他的底层是由数组+链表+红黑树组成的 (1.7之前只有数组+链表)数组初始长度是0,第一次调用put时长度扩容为16,必须重写Key对象的HashCode和Equals方法。数组大小:当通过构造函数指定数组大小时,系统会自动将该值转化为一个>=他的2的N次方的数原因:为了方便计算索引值hash&(length-1),防止出现数组越界,减少ha

2020-10-12 20:53:31 130

原创 学习笔记:ArrayList

ArrayList:JAVA中最常见的集合框架,底层是由数组实现的,他允许元素重复且是有序的,增删慢,查找快 初始的容量为0,扩容机制:先判断是不是第一次调用add方法(if (elementData==emptyArray)),如果是第一次调用add设置容量为10 如果容量满了则扩容,变为原来的1.5倍(n+(n>>1):>>1表右移一位,相当于除2的1次方)ArrayList的实现接口:①:Serializable:实现了Serializable接口后,可保证List能够持

2020-10-12 20:51:30 166

原创 学习笔记:深入浅出redis

redisredis是当前最流行的非关系型数据库,很多场景都可以使用到redis,所以有了这篇文章的诞生为什么使用redis?在项目中,很多场景的并发量很大,如秒杀之类,若不使用redis缓存直接让其访问数据库,那么会对数据库造成很大的压力从而导致数据库崩了,因此引入redis做分布式缓存redis的五种数据结构:一:String类型 keyValue都是String (可以用作缓存)二:List类型 Value可存放多个值,有序且重复(可以通过lpush,rpop实现队列 也可以通过range

2020-10-12 20:50:13 164

空空如也

空空如也

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

TA关注的人

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