- 博客(45)
- 收藏
- 关注
原创 RPC原理
RPC,即 Remote Procedure Call(远程过程调用),它可以很好的解耦系统,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC可以基于HTTP协议实现,也可以直接在TCP协议上实现。在OSI网络通信模型中,RPC跨越了传输层和应用层,使得开发包括网络分布式多程序在内的应用程序更加容易。业界一直提倡“微服务“的概念,而服务之间通信目前有两种方式,RPC就是其中一种(另一种是事件驱动方式)。RPC可以保证不同服务之间的互相调用,即使是跨语言跨平台也不是问题,
2021-08-16 22:32:37
290
原创 我就不信搞不懂Java中的这些锁
一、乐观锁和悲观锁1.乐观锁乐观锁是一种乐观思想,假定当前环境是读多写少,遇到并发写的概率比较低,读数据时认为别的线程不会正在进行修改(所以没有上锁)。写数据时,判断当前 与期望值是否相同,如果相同则进行更新(更新期间加锁,保证是原子性的)。Java中的乐观锁: CAS,比较并替换,比较当前值(主内存中的值),与预期值(当前线程中的值,主内存中值的一份拷贝)是否一样,一样则更新,否则继续进行CAS操作。如下图所示,可以同时进行读操作,读的时候其他线程不能进行写操作。2.悲观锁悲观锁是一种悲观.
2021-08-13 16:32:29
337
原创 前、中、后序遍历的迭代算法
一、前序 public static List<Integer> preOrder(TreeNode root){ List<Integer> list = new ArrayList(); Stack<TreeNode> stack = new Stack(); TreeNode cur = root; while(cur!=null || !stack.isEmpty()){
2021-07-27 18:02:08
335
原创 进程调度算法和进程通信方式
一、优先调度算法1. 先来先服务调度算法(FCFS)当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用 FCFS 算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。特点是:算法比较简单,可以实现基本上的公平。2. 短作业(进程)优先调度算法短作业优先(SJF)的调度算法是从后备队列中选择
2021-07-21 15:59:44
262
原创 BIO、NIO、AIO和多路复用IO
我们首先要知道IO发生时涉及的对象和步骤。对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:等待数据准备 (Waiting for the data to be ready)将数据从内核拷贝到进程中(Copying the data from the kernel to the process)记住这两点很重要,因为这些IO模型
2021-07-17 17:06:51
276
原创 MVCC原理解析
一、什么是MVCC?MVCCMVCC即多版本并发控制。一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。说白了MVCC就是为了实现解决读-写冲突问题时不加锁的操作,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现。二、什么是当前读和快照读?在学习MVCC多版本并发控制之前,我们必须先了解
2021-07-01 20:14:48
2332
1
原创 设计模式之桥接模式
1.定义桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分和实现部分搭桥。从软件设计的角度来分析,就是一个系统由于自身的逻辑,会有两个或多个维度的变化,有时还会形成一种树状的关系,而为了应对这种变化,我们就可以使用桥接模式来进行系统的解耦。桥接模式,作用是将一个系统的抽象部分和实现部分分离,使它们都可以独立地进行变化。 桥接模式主要用于处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层
2021-06-29 21:28:06
328
1
原创 设计模式之适配器模式
1.适配器模式(Adapter Pattern)定义:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。2.模式中的角色目标接口(
2021-06-28 21:26:17
122
1
原创 设计模式之原型模式
*定义: *用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式主要用于对象的复制,它的核心就是原型类Prototype。Prototype类需要具备以下两个条件:实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。重写Object类中的clo
2021-06-28 17:53:01
125
原创 设计模式之建造者模式
定义: 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。主要作用: 提供了一种创建对象的最佳方式,在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)。例子:造汽车 & 买汽车工厂(建造者模式):负责制造汽车(组装过程和细节在工厂内)汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了(不需要知道汽车是怎么
2021-06-28 15:25:43
114
1
原创 设计模式之工厂模式
一、 工厂模式定义工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。它提供了一种创建对象的最佳方式。也就是我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。简单来说,就是将创建产品实例的权利移交工厂,我们不再通过new来创建我们所需的对象,而是通过工厂来获取我们需要的产品。降低了产品使用者与使用者之间的耦合关系。核心本质
2021-06-27 21:43:48
226
1
原创 spring如何解决循环依赖问题
1.https://blog.csdn.net/u022812849/article/details/114264411?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161536801116780269811524%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161536801116780269811524&biz_id=0
2021-06-23 18:30:39
264
1
原创 SpringMVC的工作原理和加载流程
1.MVC工作原理:M:Model(完成业务逻辑 Service/dao/entity/)V:View(完成界面渲染 jsp/html)C:Controller(控制器->类似于CPU 接受请求->调用M->返回V)2.请求的加载流程Spring MVC前端请求到后端响应的流程如下图:1.用户发送请求到前端控制器DispatcherServlet。2.DispatcherServlet收到请求后,调用处理器映射器HandlerMapper,去请求获取处理器Handl
2021-06-17 18:15:25
983
4
原创 专项练习错题记录
public class Test {public static class A {private B ref;public void setB(B b) { ref = b; }}public static Class B {private A ref;public void setA(A a) {ref = a;}}public static void main(String args[]) {…start();….}public static void start(
2021-06-15 20:26:00
188
转载 阿里云的这群疯子
世事安稳,岁月静好。电影里才有疯子。麦克墨菲在疯人院里带领一群精神病人揭竿而起,怼天怼地;饿了三天的黑皮为了抢一口面包被店主追上高架桥,末路狂奔;杰克和泰勒在午夜的搏击俱乐部里挥拳相向,鲜血淋漓。屏幕对面,我们把爆米花塞进嘴里,哭成狗或者笑成狗。电影散场,各自回家。真正的疯子,从来不看电影。他们把别人的目光变成聚光灯,把自己的生活变成真人秀,手提钢刀用肉身串演一个浓重的角色。他们的人生结局无外乎两种:黄袍加身,或者玉石俱焚。阿里云这群疯子,就用 56 度的荷尔蒙,在横跨十年的悠长画布上涂抹了这样一个
2021-06-15 16:25:26
1043
原创 牛客网部分面试题整理
一、关键字Java里面的final关键字是怎么用的?final可以用来修饰类、类方法、以及变量当用final修饰一个类时,表明这个类不能被继承;修饰类方法时,则该方法不能被继承。也不能被重写;修饰变量时,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。关于Synchronized和lock ? synchronized是Java的关键字,是内置的语言实现;当它用来修饰一个方法或者一个代码块的时候,能够保证在同一
2021-06-15 15:44:49
873
1
原创 计算机网络
一、TCP/IP计算机网络体系结构分层:不难看出,TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等。TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。IP 负责计算机之间的通信。TCP 负责将数据分割并装入 IP 包,然后在它们到达
2021-05-31 22:31:57
238
转载 理解单例模式
一、单例模式的定义定义: 确保一个类只有一个实例,并提供该实例的全局访问点。这样做的好处是:有些实例,全局只需要一个就够了,使用单例模式就可以避免一个全局使用的类,频繁的创建与销毁,耗费系统资源。二、单例模式的设计要素一个私有构造函数 (确保只能单例类自己创建实例)一个私有静态变量 (确保只有一个实例)一个公有静态函数 (给使用者提供调用方法)简单来说就是,单例类的构造方法不让其他人修改和使用;并且单例类自己只创建一个实例,这个实例,其他人也无法修改和直接使用;然后单例类提供一个调用方法,想用
2021-05-25 15:51:14
208
原创 高并发
JUC中的生产者消费者模式问题:交替打印ABCABCABCABC…synchronized版本:package com.yang.state;public class wait implements Runnable { private String name; private Object prev; private Object self; wait(String name,Object prev, Object self){ this.n..
2021-05-24 17:05:05
274
3
原创 MySQL常用知识点详解
SQL语句分类:1.DQL:数据查询语言负责进行数据查询而不会对数据本身进行修改的语句。保留字select是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有from,where,group by,having和order by。这些DQL保留字常与其他类型的SQL语句一起使用。2.DML:数据操作语言负责对数据库对象运行数据访问工作的指令集,以insert、delete、update三种指令为核心,分别代表对表中数据进行增、删、改。3.DDL:数据定义语言负责数据结构定义与数据库
2021-03-25 16:23:45
1566
3
原创 位运算实现加法
一、原码、补码和反码原码:正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。(十进制转二进制:将整数不断除2,将余数从低位到高位依次摆放就得到了二进制。负数需要将最高位变为1)3 的原码: 0000 0011-3 的原码:1000 0011反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反3 的反码:0000 0011-3 的反码:1111 1100补码:正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得
2021-03-11 15:09:35
4651
原创 JVM深入理解
我们首先要明白,什么是java虚拟机(JVM)?Java虚拟机是一个可以执行Java字节码的虚拟机进程。因为Java源文件都会被编译器编译成.class的字节码文件,经过类加载器加载到虚拟机才能执行。我们注意一下三者的区别:JVM内存结构,和Java虚拟机的运行时区域有关(JVM内存分区)。Java内存模型,和Java的并发编程有关。Java对象结构,和Java对象在虚拟机中的表现形式有关。JVM内存结构:java内存通常被划分为5个区域:程序计数器(Program Count Regis
2021-03-10 16:37:42
558
原创 Redis重点
一、持久化Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘上,那么一旦服务器进程退出,或者突然宕机,那服务器中的数据库状态也会消失,为了使服务器即使突然关机也能保存数据,必须通过持久化的方式将数据从内存保存到磁盘中。(一)Redis的持久化机制Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:。RDB:RDB持久化过程:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,在磁盘中对应产生的数据文件为 dump.rdb。可以通过配置文件
2021-03-04 16:39:44
288
3
原创 Redis集群环境搭建
单机多集群配置。复制三个配置文件,分别为79,80,81。我要把79设置为主机,80和81设置为从机。[root@iZwz9g94s1ylux707g0qu3Z yconfig]# cp redis.conf redis79.conf[root@iZwz9g94s1ylux707g0qu3Z yconfig]# cp redis.conf redis80.conf[root@iZwz9g94s1ylux707g0qu3Z yconfig]# cp redis.conf redis81.conf[ro
2021-03-04 11:25:23
160
3
原创 Redis基础
一、什么是redis?Redis(Remote Dictionary Server,远程字典服务) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)数据库中的键值对数据库。与传统关系型数据库不同的是, Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作。它会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并在此基础上实现了master-slave(主从)同步。Redis可以用作数据库,
2021-03-02 22:54:34
324
原创 Linux中部署Redis及SpringBoot整合Redis
一、Linux下安装Redis1.官网下载安装包 redis-6.2.0.tar.gz2.程序一般放在/opt目录下,将安装包移动到/opt目录下 mv redis-6.2.0.tar.gz /opt 进行解压.tar -zxvf redis-6.2.0.tar.gz3.进入redis目录4.进行环境安装yum install gcc-c++ 安装c++环境make 配置需要的所有文件5.redis的默认安装路径: usr/local/bin6. 将redis配置文件redis
2021-03-02 22:47:11
253
原创 HashMap、HashTable和HashSet
先看集合框架图。(缺少部分知识点)。其中HashMap和HashTable都是Map集合下的,而HashSet是Set集合下的,所以严格意义上来说HashSet与HashMap、HashTable没有可比性,我放在一块是为了复习。。。一、HashMapHashMap 是一个散列表,它存储的内容是键值对(key-value)映射。它继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。而且HashMap 的实现不是同步的,这意味着它不是线程安全的。
2021-02-23 22:30:44
1223
原创 不得不知IOC和AOP
IoC与DI首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,
2021-02-22 21:33:43
231
原创 生产者消费者模式
在实际的软件开发过程中,经常会碰到:某个模块负责产生数据,然后这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就称为生产者;而处理数据的模块,就称为消费者。另外还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据。比如你要寄一封信,大致过程如下:1、你把信写好——相当于生产者制造数据2、你把信放入邮筒——相当于生产者把数据放入缓冲区3、邮递员把信从邮筒取出——相当于消费者把数据取出缓冲区
2021-02-18 21:07:49
407
2
原创 java多线程详细理解
明确一点:多线程不是为了提高程序执行速度(性能甚至更低),而是提高应用程序的使用效率。多线程的三大特性:原子性、可见性、有序性一、创建线程创建线程额的开销:分配内存 --> 列入调度 --> 线程切换的时候还要执行内存换页,CPU 的缓存被清空,切换回来的时候还要重新从内存中读取信息(破坏了数据的局部性)创建线程的三种方式:1.继承Thread(重点),重写run()方法,在main函数中,调用start()方法2.实现Runnable接口(重点),重写run()方法,在main函数
2021-02-17 23:22:53
8567
23
原创 lamda表达式
lamda表达式是jdk1.8新特性之一lamda表达式的前提:有一个函数式接口。函数式接口定义:接口中有一个函数。下面用代码做演示。首先接口中的函数时无参的本来是下面这样的:接口,接口实现类,和main方法。也就是说需要一个接口,两个类。package com.yang;public class Noargs { public static void main(String[] args) { Ilike like = new Like(); li
2021-02-15 23:14:53
2532
原创 Docker部署Nginx及Tomcat
1.下载镜像:docker pull nginx2.运行测试:[root@iZwz9g94s1ylux707g0qu3Z /]# docker images #查看镜像REPOSITORY TAG IMAGE ID CREATED SIZEmysql 5.7 a70d36bc331a 3 weeks ago 449MBmysql latest c8562eaf9d81 3 week
2021-02-13 19:26:16
367
原创 Docker常用命令
官网查询命令地址:https://docs.docker.com/reference/感觉命令好多,,,记不住,,为了方便复习,做一个记录。一、镜像命令:docker images 查看所有本地主机上的镜像docker images -a 列出所有镜像docker images -q 只显示镜像的iddocker search 搜索镜像比如docker search mysql,就会出来mysql 的镜像docker pull 下载镜像比如 docker pull mysql 就会下载m
2021-02-12 22:33:40
444
原创 Docker理解
Docker的核心思想:隔离!沙箱机制一、Docker优点虚拟机技术:虚拟出一条硬件,运行一个完整的操作系统,然后再这个系统上安装和运行软件缺点:资源占用多,冗余步骤多,启动很慢Docker:容器内的应用运行在宿主机上,没有自己的内核,也没有虚拟硬件,所以比虚拟机轻便,而且每个容器之间是互相隔离的,每个容器内都有一个属于自己的文件系统,互不影响。在Docker中,打包镜像,发布测试,一键运行,可以更便捷的升级和扩缩容!比如说一个项目,用到了SpringBoot 1.5,Redis 5 ,To
2021-02-11 18:22:29
166
原创 linux中tomcat无权限执行问题
一般来说tomcat安装按以下步骤来即可:1.下载tomcat2.使用xftp上传tomcat压缩包3.解压tomcat : tar -zxvf apache-tomcat-9.0.22.tar.gz (不同后缀名的解压命令不同)4.启动tomcat测试! ./xxx.sh脚本即可运行执行:./startup.sh停止:./shutdown.sh但是我的tomcat执行startup.sh文件时,先是出现了Permission denied, 后来又成了The file is absent
2021-02-08 16:14:22
2559
1
原创 linux中jdk安装
软件安装一般有三种方式:rpm解压缩yum在线安装这里说一下jdk的rpm安装和解压缩安装,以及tomcat的解压缩安装。rpm安装1.下载jdk1.8,必须是 .rpm 后缀的!比如 jdk-8u181-linux-x64.rpm2.检查一下是否有系统自带jdk,有的时候系统会默认安装一个openjdk,在安装.rpm后缀的jdk之前,需要把默认的jdk卸载了。如果不知道系统是否有默认jdk,可以使用 java -version z这个命令来看。如果存在默认的jdk,需要卸载。首
2021-02-08 15:57:45
180
1
原创 linux账号用户管理
linux中一切皆文件!(文件:读写执行(查看、创建、删除、移动等),权限(用户,用户组),系统(磁盘,进程))一、 账号管理用户账号的管理工作主要涉及到用户账号的添加、修改和删除。添加账号 useradd增加用户账号就是在/etc/passwd文件中为新用户增加一条记录常用参数有两个:-m 使用者目录,如不存在则自动建立。d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录创建了一个用户yangguang,其中 -m 选项用来为登录名yangguang产
2021-02-07 18:11:38
251
原创 Linux目录结构解析及其常用命令
1.压缩和解压命令因为刚开始用,需要在linux中上传jdk、tomcat等压缩包,然后解压使用。所以特地找了些不同后缀名的压缩和解压命令。.zip解压:unzip FileName.zip压缩:zip FileName.zip DirName———————————————.rar解压:rar x FileName.rar压缩:rar a FileName.rar DirName———————————————.tar解包:tar xvf FileName.tar打包:tar cvf
2021-02-07 12:51:25
201
原创 Linux服务器及环境搭建
因为电脑垃圾,虚拟机带起来太卡,所以去阿里云上买了服务器来进行linux学习,在这里记录下环境搭建过程。1.首先就是购买阿里云服务器,因为是学生,所以我走的是学生专享(真香)链接:阿里云服务器学生专享2.然后就是要在服务器端的安全组中,放行端口,如访问宝塔的8888,或者tomcat的8080,以及数据库的3306等。如果在服务器端不放行端口,那么就无法通过外部访问。端口范围格式为:3306/3306,授权对象全部为:0.0.0.0/0注意是入方向的端口,不是出方向的!3.然后点击实例 --&
2021-02-05 23:02:28
586
2
原创 Mybatis-06-动态sql
动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句常用标签:ifchoose (when, otherwise)trim (where, set)foreach通过这些标签,可组合成非常灵活的SQL语句,从而不仅提高 SQL 语句的准确性,也提高了开发人员的效率。blog表:现在要查询所有的信息?只用一句sql就可以搞定select * from blog如果要求根据输入的title查询书籍?也可以一句搞定select * from blog where title
2021-02-03 14:18:55
153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人