Java线程池深度解析
一、线程池的作用线程池是Java并发编程的核心组件,主要作用包括:
降低资源消耗,通过重复利用已创建的线程减少线程创建和销毁的开销
提高响应速度,任务到达时无需等待线程创建即可执行
提高线程的可管理性,线程是稀缺资源,线程池可进行统一分配、调优和监控
二、线程池的核心参数ThreadPoolExecutor有7个核心参数:
1234567public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, Rejected ...
WebSocket整合SpringBoot常用操作
一、WebSocket简介WebSocket是HTML5提供的全双工通信协议,客户端和服务器可以互相主动推送数据。
特点:
全双工通信
建立在TCP之上
与HTTP兼容
低开销
适用场景:
实时消息推送
在线聊天
实时数据监控
协同编辑
二、SpringBoot整合WebSocket添加依赖1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId></dependency>
开启WebSocket支持12345678@Configurationpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointE ...
HTTP协议详解
一、HTTP协议概述HTTP(HyperText Transfer Protocol)是应用层协议,用于客户端和服务器之间的通信。
特点:
无状态协议
基于请求-响应模型
简单可扩展
支持多种数据类型
二、HTTP版本HTTP/1.0
每次请求都建立新连接
请求完成后断开连接
HTTP/1.1
默认持久连接(Keep-Alive)
支持管道化
支持分块传输
增加Host头
HTTP/2.0
二进制分帧
多路复用
头部压缩
服务端推送
HTTP/3.0
基于QUIC协议
使用UDP替代TCP
减少连接建立延迟
三、HTTP请求请求方法
方法
作用
幂等
安全
GET
获取资源
是
是
POST
创建资源
否
否
PUT
更新资源
是
否
DELETE
删除资源
是
否
PATCH
部分更新
否
否
HEAD
获取响应头
是
是
OPTIONS
获取支持的方法
是
是
请求报文结构1234请求行:方法 URL 版本请求头:头部字段: 值空行请求体
示例:
123456POST /api/user H ...
单例模式详解
一、单例模式概述单例模式确保一个类只有一个实例,并提供全局访问点。
适用场景:
需要频繁创建销毁的对象
创建耗时或耗资源的对象
工具类对象
配置类对象
二、饿汉式类加载时就创建实例。
静态常量12345678910public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; }}
优点:实现简单,线程安全。缺点:类加载时就初始化,可能造成资源浪费。
静态代码块1234567891011121314public class Singleton { private static final Singleton INSTANCE; static { INSTANCE = new Si ...
OpenFeign常用操作
一、OpenFeign简介OpenFeign是Spring Cloud的声明式HTTP客户端,简化了微服务间的HTTP调用。
特点:
声明式调用,面向接口编程
集成Ribbon实现负载均衡
集成Sentinel实现服务熔断
支持Spring MVC注解
二、基本使用添加依赖1234<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
启用Feign1234567@EnableFeignClients@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, arg ...
Redis整合SpringBoot常用操作
一、Redis简介Redis是开源的内存数据结构存储系统,可用作数据库、缓存和消息队列。
特点:
高性能:基于内存操作
丰富数据类型:String、List、Set、Hash、ZSet等
持久化:RDB和AOF
高可用:主从复制、哨兵、集群
二、SpringBoot整合Redis添加依赖1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
配置连接123456789101112spring: redis: host: localhost port: 6379 password: database: 0 timeout: 3000 lettuce: pool: max-active: 8 max-idle: 8 ...
RPC
概念RPC框架:负责组装协议数据,调用传输层发送【框架】
例如Dubbo框架 openFeign框架 gRPC框架 Thrift框架
RPC协议:规定了数据的组织方式和和含义【网络层】
Dubbo 协议 HTTP协议 gRPC 协议 Thrift 二进制协议
传输:规定了数据如何在网络上移动【传输中间层】
Netty传输
底层:TCP【传输层】
TCP有粘包问题,因为它是基于字节流的,所以上层协议要定义一个消息头来定义包的大小
各种RPC框架
Netty一、开局:从最原始的 BIO 说起什么是 BO (Blocking I/O)?
模型:ServerSocket.accept()阻塞等待连接,InputStream.read()阻塞等待数据。
问题:一个连接一个线程。如果有1000个客户端,就得开1000个线程。线程是昂贵的资源(内存约1MB/线程,上下文切换开销大)。并发量一大,系统直接崩了
二、进阶:NIO 的出现(解决问题,但带来复杂度)什么是 NIO (Non-blocking I/O)?
Channel 是通道,Buf ...
多线程
模拟死锁
Thread.sleep(1000);
Thread.yield()
让当前线程睡眠或者让出CPU都是增加了死锁的概率
12345678910111213141516171819202122232425262728293031323334353637public class DeadLock { private static final Object resource1 = new Object();//资源 1 private static final Object resource2 = new Object();//资源 2 public static void main(String[] args) { new Thread(() -> { synchronized (resource1) { System.out.println(Thread.currentThread() + "get resource1"); ...
位运算
位运算种类
1. 只出现一次的数
