写一个单例模式实例
定义
某个类只能在jvm存在一个实例并给别人使用
- 只能存在一个实例 -->构造器私有化
- 它必须自行创建这个实例 -》静态变量保存
- 向整个系统提供这个实例 -》方法暴露出实例接口
分类
- 饿汉式
- 直接实例化
- 枚举式
- 静态代码块饿汉式
- 懒汉式
- 线程不安全
- 线程安全
- 静态内部类
饿汉式
- 直接实例化
public class Single {
//1.构造器私有化
private Single(){
}
//2.静态变量存储实例
private static final Single INSTANCE = new Single();
//3.暴露方法
public Single getInstance(){
return INSTANCE;
}
}
-
枚举式
枚举类一个对象即可
-
静态代码块饿汉式,适合复杂的对象实例化
public class Single { //1.构造器私有化 private Single(){ } //2.静态变量存储实例 private static final Single INSTANCE; static { INSTANCE = new Single(); } //3.暴露方法 public Single getInstance(){ return INSTANCE; } }
懒汉式
延迟创建对象
public class Single2 {
//静态共享对象
private static Single2 INSTANCE;
private Single2(){
}
public static Single2 getInstance(){
if (INSTANCE == null) {
INSTANCE = new Single2();
}
return INSTANCE;
}
}
调用静态方法时,才创建实例对象
但线程不安全,可能会创建多个实例
适用于单线程
-
线程安全性
public class Single2 { private static Single2 INSTANCE; private Single2(){ } public static Single2 getInstance() { //为了提升性能 if(INSTANCE == null){ synchronized (Single2.class) { if (INSTANCE == null) { INSTANCE = new Single2(); } } return INSTANCE; } } }
-
内部类
静态内部类不会随着外部类加载加载
使用方法的时候才会加载
内部类初始化的时候才会加载,保证了线程安全
public class Single2 {
private Single2() {
}
private static class Inner{
private static final Single2 INSTANCE = new Single2();
}
public Single2 getInstance(){
return Inner.INSTANCE;
}
}
类初始化和实例初始化
规则
- 一个类要创建实例必须要先加载并初始化该i类
- main方法所在的类需要先加载和初始化
- 一个子类初始化需要先初始化父类
- 一个类初始化执行《clint》方法
- 由静态类变量显式赋值代码和静态代码块组成
- 静态代码块从上到下顺序执行
- 只执行一次
- 实例执行《init》方法
- 有几个构造器就有几个init方法
- 非静态实例变量显式赋值代码和非静态代码块、对应构造器代码组成
- 《init方法》首行是super 会调用父类对应的init方法
类的实例化
- super() 调用父类的init方法
- 成员变量
- 子类的非静态代码块
- 子类的无参构造
方法的重写
- 非静态方法前面有一个默认的对象this
- this表示正在创建的对象
方法的参数传递
值传参
基本数据它变我不变
引用类型它变我变
常量池指针不变
基本数据类型:数据值
引用数据类型:地址值
字符串对象不可变,Integer常量池不可变
bean的作用域
可以在 元素的scope属性设置bean的作用域
分类
- singleton: 单实例 默认
- prototype : 每次调用getBean都会返回一个新的实例
- request :每次请求一个bean
- session: session共享一个bean
Linux基本命令
进程类
service: 注册在系统中的标准化程序
- service 服务名 start
- service 服务名 stop
- service 服务名 restart
- service 服务名 reload
- service 服务名 status
查看服务的方法 /etc/init.d/服务名
通过chkconfig 命令设置自启动
systemctl 操作 +服务名
git常用命令
创建分支
- git branch
- git branch -v 查看分支
切换分支
git checkout 分支名
合并分支
- git checkout master
- git merge 分支名
删除分支
git branch -D 分支名
Redis持久化
RDB
用一个子进程,快照直接回复内存
效率非常高
影响性能,备份隔一段时间,可能会丢失最后一次快照的数据
AOF
日志记录下写操作指令,只追加操作
恢复速度慢
可读的日志样本
Mysql什么时候适合建索引
索引文件存储在磁盘中
频繁作为查询条件的字段应该创建索引
排序,统计,分组字段
什么时候不要创建索引
表记录少
经常增删改
不在where条件里的字段
过滤性不好
JVM垃圾回收机制
gc放在堆丽
分代收集算法{minor gc full gc}
- 引用计数法:一般不使用
- 复制算法 年轻代中minorgc 需要双倍空间
- 标记清除 老年代 清除没有标记的对象
- 标记压缩 先标记 后压缩