单例
饿汉式 线程安全 一开始就初始化
饱汉式 非线程安全 延迟初始化
双检锁 线程安全 延迟初始化
volatile:
1、保证可见性
2、禁止指令重排序
反射
三种方式
每个对象.getClass()
类.class
Class.forName()
JDK1.8的新特性 没遇到过就先没背
异常
分为Error 和Exception
Exception 又分为
运行时异常NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等
非运行时异常(编译异常) IOException、SQLException等以及用户自定义的Exception异常
BIO NIO AIO
BIO 同步阻塞
NIO 同步非阻塞 使用了channel
AIO 异步非阻塞 异步IO基于事件和回调机制
ThreadLocal 原理
为共享变量创建一个副本 每个线程都可以访问自己的共享变量 通过threadlocal保证线程安全性
threadlocal内部有一个静态内部类 threadlocalmap 存储每一个线程的变量副本 其中key为当前的threadlocal对象 value是对应线程的变量副本
但是threadlocal本身并不存储值 只是作为一个key存到map里边 而且是一个弱引用
也就是可能会存在当一些key为null的键值对的时候gc回收 但是entry因为key为null访问不到了 所以会造成内存泄漏
同步锁 死锁 乐观锁 悲观锁
同步锁 加sychronize关键字同一时刻 只允许一个线程访问共享数据
死锁 多个线程同时被阻塞 全部都在等待某个资源被释放
乐观锁 总是假设最好的情况 每次都认为共享资源没有被占用 只有在最后提交修改的时候检测一下共享资源有没有被更新
悲观锁 总是假设最坏的情况 每次都认为数据会被修改 所以会在操作之前加锁
比如行锁 表锁 读锁 写锁
sychronize的底层实现原理
sychronize可以保证方法或者代码块在运行的时候 同一时刻只有一个方法进入临界区 同时还可以保证共享变量的内存可见性
每个对象都可以加锁
普通同步的方法 锁当前实例对象
静态同步方法 锁类的class对象
同步方法块 锁括号里边的对象
sychronize和volatile的区别
sychronize和lcok的区别
sychronize是java内置关键字 但是lock 在jvm层面就是一个java类
sychronzie适合少量同步 lock锁适合大量代码的同步问题