并发
说说多线程
1、线程和进程的关系:一个进程可以创建多个线程,线程是操作系统最小的执行单元,一个进程下的多个线程共享进程的堆空间,每个线程都有自己独立的程序计数器,虚拟机栈,本地方法栈
2、多线程存在的问题:内存泄漏,死锁,上下文切换浪费cpu资源
3、多线程有什么好处:设备角度,目前设备大多多核处理器,采用多线程的方式可以有效提高硬件的利用率 宏观角度:目前用户量增大,对并发的要求越来越高,采用多线程可以有效提高并发量
线程的创建方式
1、继承 Thread
2、实现runnable接口(推荐使用,接口特性),重写run方法
3、实现callable接口(需要返回值情况下使用),重写call方法
4、通过thread.start()开启线程
线程的状态
1、新建: 线程new
2、可运行:start(),进入可运行状态,由操作系统调度
3、阻塞:等待获取锁
4、等待:wait 等待直到notify
5、超时等待:sleep 等待直到到达预定时间
6、终止:线程运行结束
线程的通信方式
1、使用monitor实现通信,使用synchronize。常用的方法有wait,notify
2、使用condition实现通信,使用lock。常用的方法有await,signal
java中常用的锁及原理
1、关键字;synchronized:底层采用monitor(同步监视器)实现
2、接口Lock,实现类有reentrantlock,底层采用AQS实现,AQS定义了一个先进先出的队列实现锁的同步
synchronized和lock的区别
1、synchronized是关键字lock是接口
2、synchronized在出现异常或执行完成之后,自动释放锁,lock不会自动释放锁,需要在finally中释放
3、synchronized会一致等待,lock可以设置等待超时时间
4、synchronized无法获得是否获得锁成功,lock可以判断是否获得锁
synchronized的用法及原理
1、可以用来普通方法,静态方法,代码块
2、不可以用来锁构造函数
3、如果修饰普通方法,锁的是对象,如果修饰的是静态方法锁的是类,如果修饰的是代码块,显示的指定一个对象作为锁对象
4、一开始是重量级锁,重量级锁存在用户态和内核态的转变消耗CPU资源,所以后期进行了优化,存在锁升级,包括无锁状态,偏向锁,轻量级锁,重量级锁
5、底层用到monitor同步监视器
AQS的理解
1、AQS 队列同步器,用来构建同步器的基础框架
2、reentrantlock,semaphore,cyclicbarrier,countdownlatch是基于AQS构建的
3、维护了一个先进先出的队列,当共享资源空闲时,将当前请求资源线程设置为工作线程,如果被占用,就进入队列进行等待
对线程池的理解
1、优点:提高资源利用效率,有效的管理线程,防止线程导致的程序崩溃
2、threadpoolexcuter主要参数有 核心线程数,最大线程数,等待队列,拒绝策略
3、先看核心线程数有没有满,满了进入等待队列,如果等待队列满了,就新增线程数,如果达到最大线程数,根据拒绝策略处理新增线程
4、拒绝策略:抛出异常拒绝,丢弃拒绝,调用者自己run,删除队列中最老的线程
5、线程的生命周期…
volatile用法及原理
1、轻量级锁
2、修饰对象或者变量,保证其可见性和有序性
3、使用场景比如单例模式中双重校验锁为了防止未被初始化的对象赋值,需要使用volatile修饰
4、涉及JMM模型,为了解决cpu与内存之间的不匹配问题,存在cpu缓存,每个线程有自己的本地内存和并公用主内存,volatile强制本地内存更新主内存,并在读的时候,令本地内存无效,从主内存中获取
ThreadLocal理解
1、ThreadLocal在每个线程创建变量副本
2、底层维护了一个ThreadLocalMap的key是ThreadLocal,value是变量副本
3、一个threadlocal用完需要及时remove,不然可能会存在内存泄露
4、key是ThreadLocal是弱引用,value是强引用,GC时key会被回收但是value不会被回收,出现key为null,value永远不会回收
JUC
1、lock:reentranklock
2、原子类
3、线程池
4、并发工具:semaphore,countdownlatch,cyclicbarrier
5、并发容器:concurrentHashMap
CAS
1、比较并交换
2、比较和原来的一样,如果一样就更新,如果不一样再次尝试
3、原子类
4、AQS
5、concurrentHashMap