jdbc结束

This commit is contained in:
yinkanglong
2023-11-26 18:29:38 +08:00
parent f31bf5475d
commit 8090262bff
61 changed files with 3576 additions and 613 deletions

View File

@@ -1,15 +0,0 @@
## 控制的灵活性
### 应用控制的灵活性
控制的灵活性总共分为一下几种
1. 代码:开发时控制。代码写死,版本固定后无法变更。
2. 参数和环境变量:发布时控制。通过参数和环境变量,控制应用的不同表现行为
3. 动态配置:运行时控制。通过动态配置灵活调整行为。
4. 接口和界面:运行时控制。需要开发运行时接口和界面,控制应用的不同表现行为。
### spi机制中控制的灵活性
在spi机制中。
1. 编译时spijava sdk提供的ServiceLoader机制通过反射在编译时查找具体的实现。
2. 启动时spitomcat、jdbc驱动加载、spring依赖注入都是在启动时根据当前的运行环境查找具体实现。
3. 运行时spi注册中心是在运行时进行服务发现的可能在运行时进行动态变化。

View File

@@ -1,4 +1,6 @@
## 包
# 包
## 1 基本概念
包我们每天建的项目就是在一个目录下,我们每次都会建立一个包,这个包在磁盘下其实就是一个目录。**包是用来分门别类的管理技术,不同的技术类放在不同的包下**,方便管理和维护。
**包名的命名规范**

View File

@@ -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>

View File

@@ -19,7 +19,7 @@ C++中的容器分为(都是线性的)
* queue 队列
Java中的容器分为(都是线性的)集合collection。除了一下基本集合类型还有多个特殊的类型后续补充
Java中的集合容器分为单列集合collection和双列映射Map。除了一下基本集合类型,还有多个特殊的类型,后续补充
* List
* Arraylist有序插入序
* vector

View File

@@ -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前缀可以达到内存屏障的效果来进行隔离。

View File

@@ -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
View File

@@ -0,0 +1,89 @@
## 1 观察者模式
### 简介
先是一种对象间的一对多的关系;最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方)。当目标发送改变(发布),观察者(订阅者)就可以接收到改变。 观察者如何处理(如行人如何走,是快走/慢走/不走,目标不会管的), 目标无需干涉;所以就松散耦合了它们之间的关系。
别名:观察者模式、事件监听机制、事件通知机制、回调机制
### 关键概念
* 可观察对象、观察者。(观察者模式)
* 事件、响应。(事件驱动、事件监听机制、响应式编程)
### 使用场景
观察着模式在不同场景下的实现。
* java语言中的回调机制
* 设计模式中的观察者模式
* jdk中的observable和observer
* 在操作系统中就是IO多路复用的一种策略
* 在socket网络编程、IO编程中netty、springWebFlux、sofarpc就是Reactor模式
* Spring的事件驱动模型![](image/2022-10-18-12-06-37.png)
* 在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. 运行时服务发现机制,注册中心是在运行时进行服务发现的,可能在运行时进行动态变化。

View File

@@ -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 内部类对象,只提供了替换数据的方法,其底层依旧是原数组数据)

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB