悲观锁:互斥的
- 数据库锁
- update
- 修改表字段
- 追加索引
- select ... for update
- 读锁/写锁
- 共享锁/排它锁
- java锁
- synchronzed
- reetrantlock
- 第三方中间件
- redis:setnx ex
- redisson
- zookeeper
- etcd3
乐观锁:CAS思想(比较并交换)可能会引发ABA问题通过使用时间戳或者版本号解决
synchronized与lock和volatile
syn和reetranlock的区别
- syn:
- 锁在方法体上、同步代码块
- JVM统一管理
- 锁升级: 偏->轻量->重量
- re
- 代码块
- 手动lock...unlock
- 两者都是可重入锁
reetranlock 的实现原理
- AQS(abstract queue sychronzed)
- 底层有一个volitale修饰的变量
- 0:无锁状态
- 1:有锁状态
- FIFO:first in first out
- 加锁过程:变量state:0->1
- 如果加锁的过程中,发现别人加锁了,就会进入
自旋
JUC并发包
ComplateAbleFuture + CountDownLatch
Future接口
ReetrantLock
ConcurrentHashMap
CopyOnWriteArrayList(安全的arrarylist)
BIO NIO AIO
连接的四个阶段
服务器等待连接
客户端连接
服务器端准备数据,
服务器端传输数据到客户端
BIO(线程阻塞)
当客户端进行连接是,就会由线程进行处理(哪怕是数据在准备阶段,线程也是在进行阻塞)一连接一线程在高并发环境性能比较低
NIO(非阻塞io)
在高并发环境下主要采用多路复用技术,当有io请求时就会加入channel的双端,通过selcetor进行轮询查看数据状态,最后由由一个线程去统一处理io请求
AIO(异步io)
发出请求之后,不会进行阻塞,最终服务器端
threadlocal 多线程环境下
针对共享变量的每个线程都有一份,互不影响,线程对象内部有threadlocalmap,来存储线程隔离的资源,threadlocal作为key共享变量作为value,通过get和set方法进行设定保存,当不再使用是要用remove方法进行资源的清空,避免资源泄露
线程池七大参数
核心线程数 cpu密集型 ,io密集型
总线程数
存活时间(临时线程)
存活时间单位
工作队列
线程工厂
拒绝策略
线程创建的方式:
继承Thread,重写run方法,无返回值
实现Runable无返回值
实现Callable接口+future,有返回值
自定义线程池
lambda jdk8增加的特性
表达式本质
实现函数式借口
然后重写借口的唯一抽象方法
并返回实现类的实例化对象
与匿名内部类差不多,又称作箭头函数
但是匿名内部类可以实现其他借口和抽象类
匿名内部类作用与编译阶段
lambda作用与运行阶段
lambda的this作用域根据上下文,一般是包含lambda的外层类
匿名函数的this作用域是自身
反射
本质是jvm运行阶段动态获取class对象,反向加载类结构,操作类的成员
jvm在加载类时,会通过类加载器将.class文件解析成内存中的class对象,然后通过class对象访问存储在方法区的元数据
作用场景bean的注入junit的实现,mybatis的映射
效率方面:低于直接调用,因为反射要进行动态解析结构