ThreadLocal
ThreadLocal 深度解析1. 核心概念
作用:为每个线程提供独立的变量副本,解决多线程并发访问共享变量的冲突问题。
本质:线程级别的全局变量(线程隔离的全局存储)。
2. 底层原理12345678public class ThreadLocal<T> { // 关键:每个Thread对象内部维护一个ThreadLocalMap public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = t.threadLocals; // 获取线程专属的Map map.set(this, value); // 以ThreadLocal实例为key存储值 }}
存储结构:
每个 Thread 对象内部有一个 ThreadLocalMap(类似HashMap但更简单)。
Key:ThreadLocal 实例(弱引用),Value:线程的变量副本。
3. 使用场景
场 ...
SpringBoot原理
配置优先级五种配置方式
application.properties
application.yml
application.yaml
Java系统属性配置 -Dkey=value
命令行参数: –key=value
优先级:命令行参数 > 系统属性参数 > properties参数 > yml参数 > yaml参数
启动jar包时指定Java系统属性配置和命令行参数:
1java -Dserver.port=9000 -jar XXXXX.jar --server.port=10010
Bean的管理1. Bean的作用域配置
作用域
说明
singleton
容器内同名称的bean只有一个实例(单例)(默认)
prototype
每次使用该bean时会创建新的实例(非单例)
request
每个请求范围内会创建新的实例(web环境中,了解)
session
每个会话范围内会创建新的实例(web环境中,了解)
application
每个应用范围内会创建新的实例(web环境中,了解)
IOC容器中的 ...
Java中的会话,过滤与拦截
会话技术CookieCookie技术有三个自动:
服务器会 自动 的将 cookie 响应给浏览器。
浏览器接收到响应回来的数据之后,会 自动 的将 cookie 存储在浏览器本地。
在后续的请求当中,浏览器会 自动 的将 cookie 携带到服务器端。
Cookie的使用:
设置Cookie 服务端 ——> 浏览器
关键: 形参包含 HttpServletResponse
123456789101112131415161718192021@RestControllerpublic class CookieController { // 1. 设置 Cookie @GetMapping("/setCookie") public String setCookie(HttpServletResponse response) { // 创建一个 Cookie 对象 Cookie cookie = new Cookie("user_token", "abc123&qu ...
Go反射和Java反射异同点
Java反射:万物皆对象,无论是类,方法,还是属性都有自己的对象类
12345678910111213141516171819202122232425262728293031323334353637383940414243//==========获取class对象============----------------------------//通过全限定名/类名Class<?> clazz = Class.forName("com.dhrjava.refelctTestClass");Class<?> clazz = String.class;//通过已初始化对象String str = "test";Class<?> clazz = str.getClass();//=========现在已经有了clazz对象=======-----------------------------//===========创建实例=================----------------------------// ...
Go和Java多线程
Java 与 Go 并发编程对比1 并发模型核心理念Java 和 Go 在并发编程上采用了截然不同的哲学和实现模型。
Java 采用共享内存模型。其并发基于操作系统线程(内核线程),你编写的每个 Thread 都直接对应一个操作系统线程。多个线程共享进程内存空间,这使得数据共享直接,但也带来了复杂的同步问题。线程间通信主要通过读写共享变量,并使用锁(如 synchronized)或其他同步机制(如 wait()/notify())来协调访问、避免数据竞争,Java 的线程是抢占式的,由操作系统内核进行调度,这可能导致调度开销较大,尤其是在线程数量很多时。
Go 则推崇 “通过通信来共享内存” 而非“通过共享内存来通信”。其核心是 goroutine,这是一种由 Go 运行时管理的轻量级线程(协程)。大量 goroutine 可以在少量操作系统线程上高效复用。Go 运行时调度器采用 GPM 模型(Goroutine, Processor, Machine),在用户态进行协作式调度,调度开销极低。goroutine 间的通信首选**通道 (channel)**,它是一种类型安全的队列,用于 ...
JAVA基础
class 和 数组 在内存上的相似性类和数组的 名 ,均保存的是地址值
即
123456789101112131415public static class myclass(){ int num; string str; public void change(int a ,string s) { a = a+1; }}...mian...(){ myclass class01 = new myclass(); myclass class02 = class01;//这一步把class01的地址值赋值给了class02,他们两个现在指向同一片内存空间}
成员变量和局部变量的区别
初始化值不同:
成员变量有初始值,局部变量没有
内存位置不同:
成员变量在堆中(本质是跟着对象走),局部变量在栈中(本质是跟着方法走)
生命周期不同:
成员变量跟着对象走,随着对象的产生而产生,随着对象的消亡而消亡
局部变量跟着方法走,随着方法的调用而产生,随着方法结束而消亡
this关键字——>区分成员变量和 ...
学生信息管理系统
功能概述:
每个Student 对象存储一个学生的信息
查询功能:
通过姓名查询(考虑重名情况)
通过学号查询
修改功能:
修改姓名
修改学号
修改年龄
修改班级信息
增删信息:
增加/删除条目
展示全部:
展示当前全部信息
项目结构:123456789101112131415161718src └─com └─stu_info_manage ├─controller │ main.java │ UserInput.java │ ├─data │ Add_rm.java │ Change_info.java │ Info_Stroage.java │ Search.java │ Student.java │ └ ...
基础语法
CMakeLists.txt编写
文件名必须严格写为CMakeLists
基础的三句话:12345678cmake_minmum_required (VERSION 2.8) //这句话指的是支持的cmake最低版本project (test) //这句话是项目名称add_executable(test_executable_file main.c) //这句话有两类参数,第一个参数是预计生成的可执行文件,后面的参数是Cpp语言源文件,如果说有多个源文件,则在第二类参数里面添加,比如:add_executable(test2 main.cpp test.cpp)
清除命令:123make clean //清除test_executable_file可执行文件rm -rf CMakeFiles CMakeCache.txt cmake_install.cmake Makefile test_executable_file //删干净
将所有文件包含进去的命令:123456aux_source_directionary(dir var)#这句话有两个参数,前面一个dir指的 ...
静态库/动态库
形式一般来说,Windows的静态库文件扩展名是 .lib,动态库文件扩展名是 .dll (Dynamic-Link Libraries);Linux的静态库扩展名是 .a,动态库扩展名是 .so (Shared Object)
Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。Linux库有两种,一种是静态库,其命令规则为 libxxx.a;一种是共享库,其命令规则为 libxxx.so
生成静态库生成step1 编译生成.o文件1gcc -c hello.c
此时将会生成一个hello.o文件
-c 和含义:只编译,不链接
step2 使用.o文件生成 .a静态库1ar -crv libhello.a hello.o
-crv是ar命令的选项:c,r,v分别代表crate,replace,verbose
-c (create):
表示创建一个新的静态库文 ...
基础语法
1. 基础语法1.1 引用运算 & 和 const 关键字引用运算 &引用是已有变量的别名,创建引用时不会分配新内存,而是直接操作原变量。引用的特性:
必须在定义时初始化。
一旦初始化,就和原变量绑定,不能重新绑定。
代码示例:
12345678910111213#include <iostream>using namespace std;int main() { int a = 10; int &ref = a; // ref 是 a 的引用 cout << "a = " << a << ", ref = " << ref << endl; ref = 20; // 修改 ref,相当于修改 a cout << "After modifying ref: a = " << a << ", ref = " << ref & ...
