| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 1 | ()、[]、 . |
从左到右 |
| 2 | ! 、+(正)、 -(负)、 ~、 ++ 、— |
从右向左 |
| 3 | * 、/ 、% |
从左向右 |
| 4 | +(加) 、-(减) |
从左向右 |
| 5 | << 、>>、 >>> |
从左向右 |
| 6 | < 、<= 、> 、>= 、 instanceof |
从左向右 |
| 7 | == 、!= |
从左向右 |
| 8 | & |
从左向右 |
| 9 | ^ |
从左向右 |
| 10 | | |
从左向右 |
| 11 | && |
从左向右 |
| 12 | || |
从左向右 |
| 13 | ?: |
从右向左 |
| 14 | = 、+=、-=、*=、/=、%=、&=、|=、^=、~=、<<=、>>=、>>>= |
从右向左 |
一,JVM运行时内存划分
线程共享区:
- 方法堆
- java堆
线程独占区:
- 虚拟机栈
- 本地方法栈
- 程序计数区
1.1 虚拟机栈
- 虚拟机栈描述的是Java方法执行的动态内存模型;
- 栈帧:每一个方法的执行都会创建一个栈帧,伴随着方法从创建(压入虚拟机栈)到执行完成(弹出虚拟机栈)。用于存储局部变量表,操作数栈,动态链接,方法出口等。栈帧包含一个方法的主要信息。
- 局部变量表:存放编译期可知的各种基本数据类型,引用类型,方法的出口地址;局部变量表的内存空间,在编译期完成分配,当进入一个方法时,这个方法,需要在帧中分配的空间时固定的,在方法运行期间不会改变局部变量表的大小。
- StackOverFlowError:通常是递归调用方法不合理,导致虚拟机栈空间不够了
一,mybatis源码解析核心配置文件
1.1传统的jdbc
先看一看传统的jdbc,这样有助于学习mybatis:
@Test
public void test() throws SQLException {
Connection conn=null;
PreparedStatement pstmt=null;
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.创建连接
conn= DriverManager.
getConnection("jdbc:mysql://localhost:3306/mybatis_example", "root", "123456");
// SQL语句
String sql="select id,user_name,create_time from t_user where id=?";
// 获得sql执行者
pstmt=conn.prepareStatement(sql);
pstmt.setInt(1,1);
// 执行查询
pstmt.execute();
ResultSet rs= pstmt.getResultSet();
rs.next();
User user =new User();
user.setId(rs.getLong("id"));
user.setUserName(rs.getString("user_name"));
user.setCreateTime(rs.getDate("create_time"));
System.out.println(user.toString());
} catch (Exception e) {
e.printStackTrace();
}finally{
// 关闭资源
try {
if(conn!=null){
conn.close();
}
if(pstmt!=null){
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
一,安装
1,官网搜索:https://hub.docker.com/search/?q=&type=image或者`docker search 关键字`搜索

一,RabbitMQ的各种队列
1.1 死信队列
由于特定的原因导致 queue 中的某些消息无法被消费,就变成了死信,死信队列是为了优雅的处理着这些无法被消费者正常消费的信息,消息变成死信有如下三种情况:
- 消息 TTL 过期
- 队列达到最大长度(队列满了,无法再添加数据到 mq 中)
- 消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false.
架构图:

一,消息的可靠投递
1.1 消息的发布和确认
消息的发布和确认目的是为了让生产者确认消息已经投递成功了。
消息的投递流程如下:
根据消息的投递流程RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。
confirm确认模式:消息从 producer 到 exchange投递结果,设置ConnectionFactory的publisher-confirm-type="true"开启确认模式,使用rabbitTemplate.setConfirmCallback设置回调函数,在方法中判断ack,如果为true,则发送成功,如果为false,则发送失败。return退回模式:消息从 exchange 到 queue 投递结果,设置ConnectionFactory的publisher-returns="true"开启退回模式,使用rabbitTemplate.setReturnCallback设置退回函数,如果同时设置了rabbitTemplate.setMandatory(true)参数,则会将消息退回给producer。
Feigen由 Netflix 开发并开源,最初作为 Netflix OSS 的一部分,用于简化 HTTP API 的客户端调用,Netflix Feign 已停止维护,最终版本为 9.x。OpenFeigen由Spring Cloud 团队基于 Feign 开发的增强版,整合到 Spring Cloud 生态中。
一,Spring Cloud整合openFeign
第一步:添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<properties>
<spring-cloud.version>2021.0.7</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
一,手写zookeeper配置中心
1.1 实现
pom.xml引入curator去操作zookeeper:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
一,背景介绍
由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。
在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神,于2012年开源。
QLExpress脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性:
- 线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。
- 高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。
- 弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使业务的灵活度大大增强。
- 安全控制,可以通过设置相关运行参数,预防死循环、高危系统api调用等情况。
- 代码精简,依赖最小,250k的jar包适合所有java的运行环境,在android系统的低端pos机也得到广泛运用。
一,ReentrantLock原理解析
ReentrantLock的基本实现可以概括为:先通过CAS尝试获取锁。如果此时已经有线程占据了锁,那就加入AQS队列并且被挂起。当锁被释放之后,排在CLH队列队首的线程会被唤醒,然后CAS再次尝试获取锁。在这个时候,如果:
- 非公平锁:如果同时还有另一个线程进来尝试获取,那么有可能会让这个线程抢先获取;
- 公平锁:如果同时还有另一个线程进来尝试获取,当它发现自己不是在队首的话,就会排到队尾,由队首的线程获取到锁;
1.1 AQS介绍
AbstractQueuedSynchronizer简称AQS,是一个用于构建锁和同步容器的框架。事实上于java.concurrent.util包内许多类都是基于AQS构建,例如ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,FutureTask等。AQS解决了在实现同步容器时设计的大量细节问题。