单例模式
饿汉式
static 是默认全剧配置 ,运用java加载类的机制 ,在线程中是安全的
通过方法 获取 这个对象
优点是: 在类加载的时候就创建好了。是没有延迟的,没有加锁效率高
缺点是: 浪费内存,产生垃圾对象,对于反射不安全,反序列化也是不支持的
登记式
加强版的饿汉式
静态内部类,返回静态内部类中的属性
可以实现延时加载。过去实例对象的时候才进行加载。
可以通过代码实现 反 反射 (反射就报错)
原理是:当你 调用get方法回去初始化 ,因为是一个静态的属性,在虚拟机是全局作用域,反射再去创建 ,通过构造方法的 ,会我们会抛出一个异常 ,也可以通过read 方法让他反序列化也是安全的
枚举式
jdk1.5,没有构造函数,就自动防止反射了, 也支持反序列化,但是用到继承就不很恰当
懒汉式
但是是线程不安全的 , 有可能线程进入先后顺序在判断完成后,没有初始化完成,另一个就进入了
可以加线程安全关键字
也可以写成同步代码块
然后主线程运行不完成的情况 ,可以先让主线程阻塞
双重检索
因为每次同步代码块效率低
也就是双重检索,在第一次两个都没有创建的时候,第一次判断有可能只需要一次同步,在下一次进行判断的时候,就在外层判断的时候就会被拦截 ,不会再去多次同步
指令重排
使懒汉式不一定是百分之百单例模式 ,
在运行中是没问题的,在多线程中,有可能会出现 别的线程过来拿走一个指向为空的地址
解决方法
在对象上加一个 volatile 关键字 ,保证不会重排
ThreadLocal
本身不加锁,为每个线程提供一个独立副本 。只能保证在一个线程里 是单例的,在多个线程里就会不一定是单例的(也就是 开了多个线程后 ,每个线程里 new多次是单例,但是每个线程之间的地址不一样,不是单例)
CAS
for 死循环 ,会产生很多的垃圾对象,但是 会最后保证得到单例的唯一性 ,对服务器压力比较大
总结
异常
int 和 integer 的区别
算法题
大位数加法
大位数乘法
出现次数的字符串(多,少)
双层循环 逐个去比较
也可以用map 去存值,然后每次取值比较
基本数据类型不能用在泛型里
第一个重复的值
通过set 集合 , set方法不允许出现重复的,如果插入进去就说明没重复,如果重复了就输出
第一个只出现一次的字符
先统计次数,然后遍历第一个出现的字符
或者通过判断位置
看一段数字中出现的个数,并将他们按升序排序
按照输入字符,和字节数量 ,进行截取
字符串中截取匹配字符
字符串反转
输入一个字符串(含分隔符),以分隔符进行分割 ,反转输出
给定一个字符串,反转字符串每个单词字符的顺序,保留单词和空格的初始位置
验证是不是ipv4
求和最大的子序列值,开始位置和结束位置
1暴力破解法 ,就是穷举 ,所有的情况
2动态规划
主要是看前面一个集合是否为正数,自身是否为正数 ,如果前一个集合为正,自身也为正就加上,
前一个集合为负就不加