生日快乐
23岁生日啦🎂
刚好在今天The Beatles发布了新专辑《Now And Then》,这无疑是我今年收到的最好的生日礼物。1994年,保罗联系到小野洋子,从她那里拿到了列侬生前的一张磁带,一首列侬未完成的遗作,召集乔治,林戈一起,计划完成这首歌曲。但是磁带中列侬的声音并不清晰且歌曲中钢琴难以分辨,三人只得放弃。保罗对着纪录片镜头说道:“要是多一些列侬的声音就好了” “要是列侬还在就好了”
2001年乐队又失去了小乔,而随后二十多年后剩下的两位老顽童借助AI的力量修复并恢复了列侬的声音,并且加入了乔治风格的吉他solo,林戈还是来打鼓,保罗还是弹贝斯,完成了这首作品。38岁的列侬,52岁的乔治,81岁的保罗和83岁的林戈,跨越四十多年、跨越生与死的合奏,在《Now And Then》这首单曲中重聚。
有时候自己很喜欢一个乐队或者一位歌手,时常会感叹自己为什么没有出生在那个时代,为什么自己只能在纪录片中回顾他们的历史,会很想经历他们成长的历程。而今天自己有幸见证了这一刻,在第一时间看到自己最喜欢的乐队发布了新专辑,我爱这一天!
now and then
I want you ...
设计模式
创建型模式
单例模式
单例模式:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
要求:
确保一个类只有一个实例:构造方法只能是private的;并且拥有一个当前类的静态成员变量;
向整个系统提供这个实例:提供一个静态成员方法;
实现方式:
饿汉式:类加载的时候就进行实例化;
12345678910111213141516/** * @author ming * @date 2023.09.20 * @about 单例模式(饿汉式) */public class Singleton1 { private static Singleton1 singleton = new Singleton1(); private Singleton1(){ } public static Singleton1 getInstance(){ return singleton; }}
懒汉式:在类被第一次使用的时候进行实例化;
123456789101112131 ...
Java虚拟机
JVM
简介
JVM:是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
优点:
一次编写,到处运行;
自动内存管理,垃圾回收机制;
数组下标越界检查;
运行数据时区域
Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。
线程共享:堆(包括字符串常量池),方法区(包括运行时方法常量池),直接内存 (非运行时数据区的一部分)
线程私有:虚拟机栈,本地方法栈,程序计数器
程序计数器
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。
为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为 线程私有 的内存。
作用:
字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运 ...
Java多线程
多线程的概念
进程:程序的基本执行实体(例如电脑中运行的某个软件)
线程:线程是操作系统能够运算调度的最小单位。它被包含在进程中,是进程的实际运作单位。一个进程中有多个线程。
进程和线程的关系:一个进程可以有多个线程,多个线程共享进程的堆和方法区,但是每个线程有自己的程序计数器,虚拟机栈和本地方法栈。
多线程:程序同时执行多个任务;
并发(concurrent)指在java程序中同时运行多个线程;(同一时刻,多个指令在单个CPU上交替执行;)
并行:同一时刻,多个指令在多个CPU上同时执行;
线程安全性
线程安全指的是在多线程环境下,对于同一份数据,不管有多少个线程同时访问,都能保证这份数据的正确性和一致性。
线程不安全则表示在多线程环境下,对于同一份数据,多个线程同时访问时可能会导致数据混乱、错误或者丢失。
多线程的实现方式
实现方式一:自己定义一个继承自Thread的类,重写run方法;
12345678910111213141516171819202122232425262728293031323334353637383940414243public class T ...
MySQL主从复制
简介
使用MySQL主从复制,进行读写分离:随着访问量的增大,数据的吞吐量面临瓶颈,对于同一时刻有大量的读操作,但是写操作较少的场景,可以将数据库拆分为主库和从库,主库负责数据库的增删改操作,从库负责读查询操作,能够有效的避免由数据更新导致的行锁,使系统的查询性能得到很大的提升。
MySQL 是一个异步的复制过程,底层是基于mysql数据库自带的binlog功能,就是一台或多台数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制应用到自身,最终实现从库的数据和主库的数据保持一致。
MySQL主从复制是其自带功能,无需借助第三方工具。
MySQL 复制过程分为三步:
master 将改变记录到binlog;
slave 将master的binlog拷贝到它的中继日志(relay log);
slave 重做(replay)中继日志中的事件,将改变应用到自己的数据库中;
配置
配置主库(Master):master 会将改变记录到二进制日志binary log。
修改主库的配置文件 vim /etc/my.cnf,[my ...
SpringBoot实现登录拦截器
登录拦截器
在 SpringBoot 开发的项目中,通过实现拦截器来实现用户登录拦截并验证。
所有的用户请求先经过拦截器,由拦截器判断是否放行,再送往Controller层。
SpringBoot 实现登录拦截的原理
SpringBoot 通过实现HandlerInterceptor接口实现拦截器,通过实现WebMvcConfigurer接口实现一个配置类,在配置类中注入拦截器,最后再通过 @Configuration 注解注入配置。
实现HandlerInterceptor接口,可以实现 3 个方法:preHandle、postHandle、afterCompletion。
1234567891011121314151617181920212223242526272829303132333435363738394041424344public class UserLoginInterceptor implements HandlerInterceptor { /*** * 在请求处理之前进行调用(Controller方法调用之前) */ ...
Ubuntu 安装 Redis
下载稳定版本Redis
1wget https://download.redis.io/redis-stable.tar.gz
解压到指定目录
1tar -xzvf redis-stable.tar.gz -C /usr/local
编译
12cd /usr/local/redis-stablemake
安装
1make install
可能出现的报错:
没有找到 make
1sudo apt install make
/bin/sh: 1: pkg-config: not found
1sudo apt-get install pkg-config
/bin/sh: 1: cc: not found
1sudo apt install gcc
启动Redis服务
1234/usr/local/redis-stable/src$ ./redis-server# 注意这种方式启动 redis 使用的是默认配置。# 也可以通过启动参数告诉 redis 使用指定配置文件使用下面命令启动。# ./redis-server ../redis.conf
...
LeetCode刷题总结
栈和队列
最小栈:请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。
12345678910111213141516171819202122232425262728293031323334public class MyStack { private Stack<Integer> stackData; // 栈数据 private Stack<Integer> stackMin; // 栈的最小值 public MyStack1() { this.stackData = new Stack<>(); this.stackMin = new Stack<>(); } public int pop() { if (this.stackData.isEmpty()) throw new RuntimeException() ...