mirror of
https://github.com/Estom/notes.git
synced 2026-02-03 10:33:35 +08:00
jdbc结束
This commit is contained in:
@@ -1,15 +0,0 @@
|
||||
## 控制的灵活性
|
||||
### 应用控制的灵活性
|
||||
控制的灵活性总共分为一下几种
|
||||
1. 代码:开发时控制。代码写死,版本固定后无法变更。
|
||||
2. 参数和环境变量:发布时控制。通过参数和环境变量,控制应用的不同表现行为
|
||||
3. 动态配置:运行时控制。通过动态配置灵活调整行为。
|
||||
4. 接口和界面:运行时控制。需要开发运行时接口和界面,控制应用的不同表现行为。
|
||||
|
||||
|
||||
### spi机制中控制的灵活性
|
||||
|
||||
在spi机制中。
|
||||
1. 编译时spi,java sdk提供的ServiceLoader机制通过反射,在编译时查找具体的实现。
|
||||
2. 启动时spi,tomcat、jdbc驱动加载、spring依赖注入都是在启动时根据当前的运行环境查找具体实现。
|
||||
3. 运行时spi,注册中心是在运行时进行服务发现的,可能在运行时进行动态变化。
|
||||
@@ -1,4 +1,6 @@
|
||||
## 包
|
||||
# 包
|
||||
|
||||
## 1 基本概念
|
||||
包我们每天建的项目就是在一个目录下,我们每次都会建立一个包,这个包在磁盘下其实就是一个目录。**包是用来分门别类的管理技术,不同的技术类放在不同的包下**,方便管理和维护。
|
||||
|
||||
**包名的命名规范**:
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。
|
||||
|
||||
### Collection
|
||||
### Collection单列集合
|
||||
|
||||
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/image-20191208220948084.png"/> </div><br>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
- PriorityQueue:基于堆结构实现,可以用它来实现优先队列。
|
||||
|
||||
### Map
|
||||
### Map双列映射
|
||||
|
||||
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/image-20201101234335837.png"/> </div><br>
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ C++中的容器分为(都是线性的)
|
||||
* queue 队列
|
||||
|
||||
|
||||
Java中的容器分为(都是线性的)集合collection。除了一下基本集合类型,还有多个特殊的类型,后续补充
|
||||
Java中的集合容器分为单列集合collection和双列映射Map。除了一下基本集合类型,还有多个特殊的类型,后续补充
|
||||
* List
|
||||
* Arraylist,有序,插入序
|
||||
* vector
|
||||
|
||||
@@ -52,6 +52,7 @@ AtomicBoolean 内部持有了一个 volatile变量修饰的value,
|
||||
|
||||
即CAS的交换思想.
|
||||
AtomicBoolean 内部可以保证,在高并发情况下,同一时刻只有一个线程对变量修改成功。
|
||||
```java
|
||||
/**
|
||||
* Atomically update Java variable to <tt>x</tt> if it is currently
|
||||
* holding <tt>expected</tt>.
|
||||
@@ -61,6 +62,7 @@ public final native boolean compareAndSwapInt(Object o, long offset,
|
||||
int expected,
|
||||
int x);
|
||||
Unsafe.compareAndSwapInt()介绍
|
||||
```
|
||||
|
||||
三、应用
|
||||
1、AtomicBoolean 示例
|
||||
@@ -92,7 +94,7 @@ public class AtomicBooleanDemo1 {
|
||||
}
|
||||
}
|
||||
2、 使用volatile 替换
|
||||
|
||||
```java
|
||||
public class AtomicBooleanDemo2 {
|
||||
|
||||
// 设置初始化值为false,通过volatile变量保证线程可见性
|
||||
@@ -121,10 +123,11 @@ public class AtomicBooleanDemo2 {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
针对这种boolean类型的并发操作,可以使用AtomicBoolean进行设置即可
|
||||
|
||||
三、源码分析
|
||||
```java
|
||||
public class AtomicBoolean implements java.io.Serializable {
|
||||
private static final long serialVersionUID = 4654671469794556979L;
|
||||
// setup to use Unsafe.compareAndSwapInt for updates
|
||||
@@ -155,8 +158,9 @@ public class AtomicBoolean implements java.io.Serializable {
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
将expect和AtomicBoolean的value进行比较,若一致则更新为update,否则返回false
|
||||
|
||||
```java
|
||||
/**
|
||||
* Atomically sets the value to the given updated value
|
||||
* if the current value {@code ==} the expected value.
|
||||
@@ -172,7 +176,7 @@ public class AtomicBoolean implements java.io.Serializable {
|
||||
// 通过unsafe的cas方法操作,比较并替换,底层通过lock前缀加锁实现原子性
|
||||
return unsafe.compareAndSwapInt(this, valueOffset, e, u);
|
||||
}
|
||||
|
||||
```
|
||||
四、unsafe方法的实现原理
|
||||
1、unsafe的compareAndSet内部是如何保证原子性的?
|
||||
底层通过cmpxchg汇编命令处理,如果是多处理器会使用lock前缀,可以达到内存屏障的效果,来进行隔离。
|
||||
|
||||
@@ -4,6 +4,14 @@
|
||||
|
||||
总共包括六个主要的部分。学完就能毕业啦。开始吧。
|
||||
|
||||
|
||||
|
||||
对一个软件的了解程度
|
||||
|
||||
使用:快速搭建器软件,运行,实现基础的内容。(看quick start中的内容和视频即)
|
||||
精通:了解每一个配置的细节,能够进行深度定制化。(看用户文档和API参考)
|
||||
源码:掌握底层的原理,能进行破坏性的改进和学习。(看代码仓库源码)
|
||||
|
||||
### Java 的学习路线(视频打卡系列)
|
||||
|
||||
- [ ] 基础知识(学习方式——阅读书籍)
|
||||
@@ -23,12 +31,12 @@
|
||||
- [ ] JDBC
|
||||
- [ ] lombak
|
||||
- [ ] mybatis
|
||||
- [ ] Java 工具教程(Java 使用的关键工具,白天学习一下)
|
||||
- [x] Java 工具教程(Java 使用的关键工具,白天学习一下)
|
||||
- [x] maven 教程
|
||||
- [x] idea 教程
|
||||
- [ ] Java 框架教程(Spring 全家桶,白天自学)
|
||||
- [x] Spring
|
||||
- [ ] Springboot
|
||||
- [x] Springboot
|
||||
- [ ] Spring MVC
|
||||
- [ ] SpringCloud
|
||||
- [ ] Java云原生
|
||||
|
||||
89
Java/Java核心思想.md
Normal file
89
Java/Java核心思想.md
Normal file
@@ -0,0 +1,89 @@
|
||||
|
||||
## 1 观察者模式
|
||||
|
||||
### 简介
|
||||
|
||||
先是一种对象间的一对多的关系;最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方)。当目标发送改变(发布),观察者(订阅者)就可以接收到改变。 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的), 目标无需干涉;所以就松散耦合了它们之间的关系。
|
||||
|
||||
别名:观察者模式、事件监听机制、事件通知机制、回调机制
|
||||
|
||||
|
||||
### 关键概念
|
||||
* 可观察对象、观察者。(观察者模式)
|
||||
* 事件、响应。(事件驱动、事件监听机制、响应式编程)
|
||||
|
||||
|
||||
### 使用场景
|
||||
观察着模式在不同场景下的实现。
|
||||
* java语言中的回调机制
|
||||
* 设计模式中的观察者模式
|
||||
* jdk中的observable和observer
|
||||
* 在操作系统中就是IO多路复用的一种策略
|
||||
* 在socket网络编程、IO编程中(netty、springWebFlux、sofarpc)就是Reactor模式
|
||||
* Spring的事件驱动模型
|
||||
* 在UI框架中就是Listener,事件监听机制和响应机制
|
||||
* 在web网站开发中,被称为响应式编程。
|
||||
* 消息队列中的事件通知机制,消息队列中通过Event的事件传递变化。
|
||||
|
||||
|
||||
|
||||
## 2 服务发现机制
|
||||
|
||||
### 简介
|
||||
|
||||
|
||||
观察者模式是一种**传递变化的功能**。强调的是变化发生时,那些关注该变化的角色都会收到相应的通知,而采取对应的操作。
|
||||
|
||||
而服务发现机制强调的是**建立关系的过程**,强调的是一个角色B通过某种机制与角色A建立永久的关系,建立关系后角色B和角色A之间往往采取更加直接的联系,例如本地调用或者远程调用。也可能建立关系后进行间接的事件通知逻辑,例如springfactories发现spring.factories中定义的扩展接口后,实例化这些接口,然后通过事件监听机制通知这些接口的实现类发生了变化。
|
||||
|
||||
服务发现机制,本质上也是一种解耦。角色B自身的逻辑不会依赖具体的实现,可以由不同的实现方提供。
|
||||
|
||||
别名:服务发布机制、订阅发布机制
|
||||
|
||||
### 关键概念
|
||||
* 发布者、订阅者。(发布订阅机制)
|
||||
* 提供者、消费者
|
||||
|
||||
### 使用场景
|
||||
|
||||
服务发现机制。以下并不是观察者模式的范畴,是一种更加宏观的机制,可能使用了观察者模式去发现。
|
||||
* javaSPI。服务提供者接口,在编译阶段基于文件对服务进行发现
|
||||
* SpringFactories。Spring的服务发现机制,通过文件发现接口的实现。
|
||||
* 在微服务中就是注册中心的发布订阅过程。发布者订阅者、提供者消费者。
|
||||
* 消息队列中的订阅发布模式,在消息队列中就是通过topic建立订阅发布关系。
|
||||
|
||||
|
||||
|
||||
## 3 扩展机制
|
||||
扩展机制。框架这些东西就是为了给别人用的,写好了核心逻辑,让用户在核心逻辑的基础上进行扩展。这也是软件设计的原则。提供代码复用。
|
||||
|
||||
依赖可以分为两种核心依赖。
|
||||
* 一种是库即工具,你自己创建核心的流程和逻辑,调用库中的方法完成一些简化的操作。
|
||||
* 一种是框架。框架一般会创建好核心的流程和逻辑,你只是在框架的扩展点上进行扩展,实现一些业务相关的细节。
|
||||
|
||||
|
||||
复用是框架的核心目的,扩展性是衡量框架好快的基本指标,扩展机制主要分为一下三个阶段
|
||||
* 发现:框架提供给了发现扩展点的方法的方法,有些是框架提供的有些是语言提供的。
|
||||
* JavaSPI机制。本地的接口注册和发现。
|
||||
* 接口机制。Java提供的设计实现了某些接口就会被发现
|
||||
* 注解机制。使用了某些给定的注解就可以视为某个扩展
|
||||
* 调用:发现扩展点后,如何讲扩展点生效。
|
||||
* 直接的调用行为。直接调用发现的服务弯沉给某些操作
|
||||
* 回调机制。在生命周期的某个阶段,回调扩展点的具体方法。
|
||||
|
||||
|
||||
## 控制的灵活性
|
||||
### 应用控制的灵活性
|
||||
控制的灵活性总共分为一下几种
|
||||
1. 代码:开发时控制。代码写死,版本固定后无法变更。
|
||||
2. 参数和环境变量:发布时控制。通过参数和环境变量,控制应用的不同表现行为
|
||||
3. 动态配置:运行时控制。通过动态配置灵活调整行为。
|
||||
4. 接口和界面:运行时控制。需要开发运行时接口和界面,控制应用的不同表现行为。
|
||||
|
||||
|
||||
### 服务发现机制中控制的灵活性
|
||||
|
||||
不同阶段的服务发现机制的灵活性
|
||||
1. 编译时服务发现机制,java sdk提供的ServiceLoader机制(SPI)通过反射,在编译时查找具体的实现。
|
||||
2. 启动时服务发现机制,tomcat、jdbc驱动加载、spring依赖注入都是在启动时根据当前的运行环境查找具体实现。
|
||||
3. 运行时服务发现机制,注册中心是在运行时进行服务发现的,可能在运行时进行动态变化。
|
||||
@@ -1,4 +1,23 @@
|
||||
## 总结文档
|
||||
|
||||
- [总结文档](#总结文档)
|
||||
- [普通集合](#普通集合)
|
||||
- [并发集合](#并发集合)
|
||||
- [字节流与字符流](#字节流与字符流)
|
||||
- [static、final、super、this 关键字(this、super 不能用在 static 方法中)以及泛型](#staticfinalsuperthis-关键字thissuper-不能用在-static-方法中以及泛型)
|
||||
- [异常体系](#异常体系)
|
||||
- [ava 的 IO](#ava-的-io)
|
||||
- [java 对象如何判断是否可以回收(注意,此处仅仅为判断对象是否可达,不一定判断对象是否可以回收)](#java-对象如何判断是否可以回收注意此处仅仅为判断对象是否可达不一定判断对象是否可以回收)
|
||||
- [java 中的 SPI](#java-中的-spi)
|
||||
- [Java 虚拟机](#java-虚拟机)
|
||||
- [Java 锁机制](#java-锁机制)
|
||||
- [java 多线程](#java-多线程)
|
||||
- [Spring](#spring)
|
||||
- [Mybatis](#mybatis)
|
||||
- [Apache HttpClient](#apache-httpclient)
|
||||
|
||||
|
||||
|
||||
### 普通集合
|
||||
|
||||
- Arrays.asList()返回的是视图(ArrayList 内部类对象,只提供了替换数据的方法,其底层依旧是原数组数据)
|
||||
BIN
Java/image/2022-10-18-12-06-37.png
Normal file
BIN
Java/image/2022-10-18-12-06-37.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 179 KiB |
Reference in New Issue
Block a user