![](https://img-blog.csdnimg.cn/20210620202117312.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
文章平均质量分 77
牧心.
心之所向,素履以往
展开
-
单例模式(六种方式)
因为 SingletonHolder 类没有被主动使用,只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance。和上面 懒汉式(线程不安全)实现上唯一不同是:获取实例的getInstance()方法上加了同步锁。保证了多线程场景下的单例。注意volatile关键字的使用,保证了各线程对singleton静态实例域修改的可见性。此种实现中不用每次需要获得锁,减少了获取锁和等待的事件。这是最基本的实现方式,第一次调用才初始化,实现了。原创 2022-10-24 14:35:49 · 6801 阅读 · 1 评论 -
【RPC】注册中心实现方案之ZooKeeper
ZooKeeper是一个开源的分布式协调服务,它可以用来协调和同步多服务器之间的状态。ZooKeeper 可以作为微服务架构中注册中心的选型,它最需要被关心的也是数据模型和一致性协议。数据模型关乎服务信息在 ZooKeeper 服务中的存储结构,而一致性协议是注册中心服务状态一致性的保障。首先介绍 ZooKeeper 的数据存储模型,它的数据存储模型就是一棵树的结构,树的一个节点就是 ZooKeeper 的一个数据节点 Znode,而数据的路径及它的命名规则与文件系统类似,由斜杠“/”分割每个层级。下图为原创 2022-07-07 18:13:56 · 16770 阅读 · 0 评论 -
【RPC】分布式一致性与一致性协议
在CAP、ACID和BASE中都提到了一致性。但是对于一致性的整个定义还是非常模糊的,所以本文会详细介绍一致性的模型,以及目前比较流行的一致性协议。数据一致性并不只有存在与不存在两种情况,就像可以用0%到100%之间的任意数值来代表可用性的程度一样,一致性也有一些分类。一致性模型按照强弱可以粗略地分为弱一致性模型、最终一致性模型和强一致性模型。下面就分别介绍一下这几种一致性模型。线性一致性又称为原子一致性和强一致性。如果需要达到线性一致性,则需要满足如下条件:第一点非常容易理解,第二点则约束了两个维度下时间原创 2022-07-06 09:44:56 · 16535 阅读 · 0 评论 -
【RPC】CAP 模型与 ACID、BASE 理论
注册中心是一个有状态的服务,不仅仅是注册中心,还有配置中心、元数据中心都是有状态服务。除了有状态服务,还有无状态服务。**如何区分服务是否有状态?**如果服务运行的实例不会在本地存储需要持久化的数据,也就是该服务处理一次请求所需的数据,绝对不会从服务自身中获取,所需的数据要么包含在这个请求内,要么从外部服务获取,则这类服务被称为无状态服务(Stateless Service)。举个例子,一个服务只提供了计算差值的能力,一次请求到达服务端,它就会计算两个值的差值,并返回给客户端,服务端并不保存任何数据信息,这原创 2022-07-04 18:46:37 · 16461 阅读 · 0 评论 -
【RPC】注册中心
注册中心是什么?看到“注册”两个字,最想想到的就是访问有些平台需要登陆账号,我们可以通过注册账号的方式获得一个合规的登陆账号,用于访问相关平台。在微服务架构体系中,注册中心是一个用来提供服务注册的重要组件,他本身就是一个服务。RPC中的服务暴露的过程,其中服务导出到远程的过程就会将服务注册到注册中心。将服务注册到注册中心,本质上就是将服务的信息存储在注册中心的Server端,和注册账号的行为非常类似。注册中心管理者服务的这些信息:服务提供者和服务消费者的地址信息、服务接口的全限定名,并且管理这些信息的关系。原创 2022-06-30 16:41:08 · 17006 阅读 · 0 评论 -
【RPC】动态代理及源码分析
动态代理及其源码分析1. 动态代理简介动态代理在RPC中的应用2. JDK自带的动态代理方法通过JDK实现动态代理的原理3. CGLib动态代理方案使用CGLib实现动态代理的原理原创 2022-06-28 12:59:28 · 18367 阅读 · 2 评论 -
【RPC】序列化与反序列化
1. 基本概念?2. 文本格式的序列化方案2.1 XML格式2.2 JSON格式3. 二进制格式的序列化方法4. 序列化框架选型原创 2022-06-26 22:05:00 · 18846 阅读 · 0 评论 -
【RPC】I/O模型——BIO、NIO、AIO及NIO的Rector模式
1. I/O模型1.1 用户进程与系统进程1.2 一次I/O操作经历了什么?1.3 I/O模型是什么?2. Java对I/O模型的封装2.1 BIO2.2 NIO2.3 NIO的Rector模式2.3.1 单Rector单线程模型2.3.2 单Rector多线程模型2.3.3 主从Rector多线程模型2.4 AIO......原创 2022-06-23 09:28:12 · 18143 阅读 · 2 评论 -
【RPC】RPC基本介绍
0. RPC是什么1. RPC的核心组成部分1.1 服务调用方(Consumer)1.2 服务提供方(Provider)1.3 本地存根(stub)1.4 RPC通信者(RPCRuntime)2. RPC调用过程2.1 服务暴露的过程2.2 服务发现的过程2.3 服务引用的过程2.4 方法调用的过程......原创 2022-06-14 23:29:24 · 36364 阅读 · 1 评论 -
【Java】Java的垃圾回收机制小结
本篇文章介绍了Java的垃圾回收机制、引用类型、JVM一次完整的GC流程、垃圾回收算法以及经典的垃圾回收器原创 2022-06-06 01:31:44 · 26315 阅读 · 1 评论 -
【MySQL】对日志log的了解
MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情:日志文件记入文件中的信息类型错误日志记录启动、运行或停止mysqld时出现的问题。查询日志记录建立的客户端连接和执行的语句。更新日志记录更改数据的语句。不赞成使用该日志。二进制日志记录所有更改数据的语句。还用于复制。慢日志记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。1)binlog基本介绍binlog 记录所有数据库表结构变更原创 2022-05-08 17:33:51 · 27783 阅读 · 1 评论 -
【重看Java基础】继承——类、超类和子类
继承的基本思想是,可以基于已有的类创建新的类。继承已存在的类就是复用(继承)这些类的方法,而且增加一些新的方法和字段,使心嘞能够使用新的情况。1.定义子类Java使用extengs表示继承。在Java中,所有的继承都是公共继承,而没有C++中的私有继承和保护继承。关键字extends表明正在构造的新类派生于一个已存在的类。这个类称为超类、基类或父类;新类称为子类、派生类或孩子类。通过扩展超类定义子类的时候,只需要指出子类与超类的不同之处。在设计类的时候,应该将最一般的方法放在超类中,而将更特殊的方原创 2022-01-10 21:41:21 · 3167 阅读 · 0 评论 -
【java】ArrayList
ArrayList 的底层是数组队列,相当于动态数组,它的容量能动态增长。ArrayList继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.原创 2021-12-25 23:57:00 · 788 阅读 · 0 评论 -
【Java多线程】 静态同步synchronized方法与synchronized(class)代码块
8. 静态同步synchronized方法与synchronized(class)代码块关键字synchronized还可以应用static静态方法上,如果这样写,那是对当前的.java文件对应的Class类进行持锁。*下面通过通过例子说明一下用法与效果。(1) Service.javapublic class Service { synchronized public static void printA() { try { System.out.println("线程名称为:" +原创 2021-10-13 13:36:42 · 46264 阅读 · 0 评论 -
【Java多线程】synchronized同步语句块
synchronized方法是对当前对象进行加锁,而synchronized代码块是对某一个对象进行加锁。1.synchronized方法的弊端在使用synchronized关键字来声明方法的时,线程需要排队执行,运行时间较长。2.synchronized同步代码块的使用当两个并发线程访问同一个对象object中的synchronized(this)同步代码时,一段时间内只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。下面通过一个示例来说..原创 2021-10-11 22:10:42 · 46780 阅读 · 0 评论 -
【Java多线程】synchronized同步方法
“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取得的数据其实是被更改过的。1. 方法内的变量为线程安全“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了。2. 实例变量非线程安全如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。只需要在方法前加关键字synchronized即可。两个线程访问同一个对象中的同步方法时一定是线程安全的原创 2021-10-11 03:01:14 · 47016 阅读 · 0 评论 -
【Java多线程】线程的优先级、守护线程
1. yield方法yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。当放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。2. 线程的优先级在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源越多,也就是CPU优先执行优先级较高的线程对象中的任务。在Java中,线程的优先级分为1~10这10个等级,如果小于1或大于10,则JDK抛出异常throw new IllegalArgumentException()。JDK中使用3个原创 2021-10-05 22:21:48 · 48480 阅读 · 0 评论 -
【Java多线程】停止线程
目录1. 停止线程的方法2. 判断线程是否是停止状态3. 能停止的线程——异常法4. 在沉睡中停止5. 能停止的线程——暴力停止6. 方法stop()与java,lang.ThreadDeath异常7. 使用return停止线程1. 停止线程的方法在Java中有以下3种方法可以终止正在进行的线程:1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。2)使用stop方法强行终止线程,但是不推荐使用这个方法,因为stop和suspend及resum原创 2021-10-03 23:40:34 · 50603 阅读 · 0 评论 -
【Java多线程】Thread的几个方法
1. start()方法导致此线程开始执行;Java虚拟机调用此线程的run()方法。结果是两个线程同时运行:当前线程(从调用返回到start方法)和另一个线程(执行其run方法)。不止一次启动线程是不合法的。特别地,一旦线程完成执行就可能不会重新启动。异常:IllegalThreadStateException - 如果线程已经启动。// 源代码,定义public synchronized void start() { /** * This method is .原创 2021-10-03 21:56:10 · 47727 阅读 · 0 评论 -
【Java多线程】Java多线程技能
到1. 进程和多线程的概念及线程的优点提到多线程这个技术就不得不提及“进程”这个概念,在“百度百科”中对进程的解释如下:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。进程是受操作系统管理的基本运行单元。那什么是线程呢?线程可以理解成是在原创 2021-10-02 21:57:24 · 47850 阅读 · 2 评论 -
【Spring】mybatis-spring
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和SqlSession并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。Spring 2.0 只支持 iBatis 2.0。那么,我们就想将 MyBat...原创 2021-08-18 18:25:17 · 64018 阅读 · 0 评论 -
【MySQL】触发器
对触发器的支持是在MySQL 5中增加的。1.触发器触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):DELETE; INSERT; UPDATE。其他MySQL语句不支持触发器。2. 创建触发器在创建触发器时,需要给出4条信息:唯一的触发器名; 触发器关联的表; 触发器应该响应的活动(DELETE、INSERT或UPDATE); 触发器何时执行(处理之前或之后)。【保持每个数据库的触发器名唯一】.原创 2021-07-21 16:04:03 · 64585 阅读 · 0 评论 -
【MySQL】视图
1. 为什么使用视图重用SQL语句。 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节。 使用表的组成部分而不是整个表。 保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据(添加和更新数据存在某些限制)。视图仅仅是用来查看存储在别处的数原创 2021-07-21 15:16:39 · 63613 阅读 · 0 评论 -
【MySQL】插入、更新与删除数据
1. 可以用几种方式使用:插入完整的行; 插入行的一部分; 插入多行; 插入某些查询的结果。2. 提高整体性能数据库经常被多个客户访问,对处理什么请求以及用什么次序处理进行管理是MySQL的任务。INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的SELECT语句的性能。如果数据检索是最重要的(通常是这样),则你可以通过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级,如下所示:INSERT原创 2021-07-21 14:13:49 · 64243 阅读 · 1 评论 -
【MySQL】分组数据(GROUP BY 和 HAVING)
1. 在具体使用GROUP BY子句前,需要知道一些重要的规定GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。 GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。 除聚集计算原创 2021-07-17 17:22:17 · 63729 阅读 · 0 评论 -
【MySQL】数据处理函数 与 聚集函数
在文章的开头先记录一下“创建计算字段”的相关内容。1.客户机与服务器的格式可在SQL语句内完成的许多转换和格式化工作都可以直接在客户机应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在客户机中完成要快得多,因为DBMS是设计来快速有效地完成这种处理的。2. 拼劲字段拼接(concatenate) 将值联结到一起构成单个值。【MySQL的不同之处】 多数DBMS使用+或||来实现拼接,MySQL则使用Concat()函数来实现。当把SQL语句转换成MySQL语句时一定要把这个..原创 2021-07-16 20:12:16 · 64004 阅读 · 0 评论 -
【MySQL】通配符与正则表达式
1.百分号(%)通配符最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现任意次数。匹配时,一般是不区分大小写的,但是根据MySQL的配置方式,搜索可以是区分大小写的。重要的是要注意到,除了一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符,例如:SELECT id, name FROM test_table WHERE info LIKE '%ab%ed';注意尾空格 尾空格可能会干扰通配符匹配。例如,在保存词anvil 时, 如果它后面有一.原创 2021-07-16 18:59:31 · 64345 阅读 · 0 评论 -
【MySQL】MySQL的一些细节知识
1.未排序数据查询时,如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义。返回数据的顺序可能是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正常的。2.结束SQL语句多条SQL语句必须以分号(;)分隔。MySQL如同多数DBMS一样,不需要在单条SQL语句后加分号。但特定的DBMS可能必须在单条SQL语句后加上分号。当然,如果愿意可以总是加上分号。事实上,即使不一定需要,但加上分号肯定没有坏处。如果你使用的是mysql命令行,必须加上分号来结束SQL语句。..原创 2021-07-12 16:07:47 · 65427 阅读 · 4 评论 -
【Mybatis】错误记录
bug 1错误:java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.company.org.pojo.Student原因:把resultType错写成resultMapbug 2错误:org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.原创 2021-07-10 00:40:06 · 66644 阅读 · 0 评论 -
【Mybatis】多表查询(一对多、多对一)
先说明一下本文的例子:学生-老师。一对多:查询某位老师的所有学生。多对一:查询所有学生以及他们的老师。1. resultMapresultMap元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBCResultSets数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份resultMap能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到...原创 2021-07-10 00:36:20 · 64405 阅读 · 0 评论 -
【Mybatis】日志
Mybatis 通过使用内置的日志工厂提供日志功能。内置日志工厂将会把日志工作委托给下面的实现之一:SLF4J Apache Commons Logging Log4j 2 Log4j JDK loggingMyBatis 内置日志工厂会基于运行时检测信息选择日志委托实现。它会(按上面罗列的顺序)使用第一个查找到的实现。当没有找到这些实现时,将会禁用日志功能。不少应用服务器(如 Tomcat 和 WebShpere)的类路径中已经包含 Commons Logging。注意,在这种配置环境下原创 2021-07-07 14:21:53 · 65230 阅读 · 0 评论 -
【Mybatis】缓存
1、什么是缓存Cache ? 存在内存中的临时数据。 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。 2、为什么使用缓存?减少和数据库的交互次数,减少系统开销,提高系统效率。3、什么样的数据能使用缓存?经常查询并且不经常改变的数据。Mybatis缓存 MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极原创 2021-07-06 22:34:42 · 64226 阅读 · 0 评论 -
【Mybatis】动态SQL 实例
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。本篇文章要讲的mybatis元素主要有if choose (when, otherwise)原创 2021-07-02 22:17:27 · 77007 阅读 · 7 评论 -
【Mybatis】配置之属性优化
1. 环境配置(environments)MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,原创 2021-06-29 21:59:54 · 66206 阅读 · 1 评论 -
【Mybatis】Map传参和模糊查询
本文项目承接【Mybatis】增删改查的实现1. map传参1.1 insert(1)在UserMapper.java文件中添加:// insert mapint addUserMap(Map<String, Object> map);(2)在UserMaooer.xml文件中添加:<insert id="addUserMap" parameterType="map"> insert into user(id, name, pwd) valu.原创 2021-06-29 21:22:36 · 66083 阅读 · 0 评论 -
【Mybatis】增删改查的实现
本文承接【Mybatis】一个Mybatis程序。namespace的包名要和Dao/mapper接口的包名一致!<mapper namespace="com.company.org.dao.UserMapper"> <!-- ... --></mapper>MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省.原创 2021-06-28 20:20:29 · 65697 阅读 · 0 评论 -
【Mybatis】一个Mybatis程序
思路:搭建环境——>导入mybatis——>编写代码——>测试原创 2021-06-22 21:03:03 · 66284 阅读 · 0 评论 -
【Mybatis】Mybatis入门
1.什么是 MyBatis?MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。...原创 2021-06-20 20:03:04 · 66980 阅读 · 0 评论 -
【Spring】AOP(三)注解实现AOP
没有什么理论,直接写例子吧。项目结构AnnotationPointCut.javapackage com.company.org.diy;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.Signature;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Around;import org.原创 2021-06-19 20:06:54 · 66623 阅读 · 1 评论 -
【Spring】AOP(二)自定义来实现AOP
主要是切面定义。和【Spring】AOP(一)使用Spring的API接口不同的是原创 2021-06-19 15:50:23 · 67952 阅读 · 0 评论