多线程
2020-11-20 17:32:04 8 举报
AI智能生成
多线程
作者其他创作
大纲/内容
JUC
AQS
LOCK
ReentrantLock<br>
ReentantLock 继承接口Lock 并实现了接口中定义的方法,他是一种可重入锁,除了能完<br>成synchronized 所能完成的所有工作外,还提供了诸如可响应中断锁、可轮询锁请求、定时锁等<br>避免多线程死锁的方法。
内部实现:CLH变种队列,线程由原自旋机制改为阻塞机制。<br>
ReentrantReadWriterlock<br>
实现了ReentantLock的所有功能,增加了读写锁
tools
Semaphore
字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目。<br>资源访问,服务限流。
acquire():表示阻塞并获取许可
release():表示释放许可
CountDownLatch
作用:使某个线程等待其他线程,完成各自工作后,再执行<br>
实现:是通过一个计数器来实现的,计数器的初始值为线程的数量。每当<br>一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的<br>线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务
CyclicBarrier
栅栏屏障,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程<br>到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
cyclicBarrier.await();<br>每个线程调用和await方法,表示到达屏障<br>
线程池(Executors<br>主)
newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需<br>要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool<br>
创建一个定长线程池,可指定并发数,超出的线程可在队列中等待<br>
newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执<br>行。
ewSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作<br>线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
原理:线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后<br>启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,<br>再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。
状态
RUNNING
shutdown
stop
TIDYING
TERMINATED
ThreadPoolExecutor<br>
corePoolSize/核心线程数<br>
maximumPoolSize/最大线程数<br>
keepAliveTime/空闲时间<br>
TimeUnit/空闲时间单位
BlockingQueue/阻塞队列
ThreadFactory/线程创建工厂
RejectedExecutionHandler/拒绝策略
关键字
volatile
1.是Java虚拟机提供的轻量级的同步机制<br>
2.可见性:保证被volatile修饰过的变量,对所有线程可见;可见性指的是当一个线程修改了变量的值,那么新的<br>值对于其他线程是可以立即获取的。
3.禁止指令重排
实现:通过汇编lock前缀指令,它会锁定变量缓存行区域并写回主内存,这个操作称为“缓存锁定”,缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据。一个处理器的缓存回写到内存内存会导致其他处理器的缓存无效<br>
volatile保证可见性与有序性,但是不能保证原子性,要保证原子性需要借助synchronized、Lock锁机制,同理也能保证有序性与可见性
sychronized
加锁方式<br>
1.同步实例方法,锁当前实例对象
2.同步类方法,锁当前类对象<br>
3.同步代码块,锁括号里的对象<br>
原理
JVM内置锁,通过sychronized,通过内部Monitor(监控锁),MonitorEnter进入,<br>MonitorExit退出,监视锁依赖MutexLock,实现,重量级锁性能较低,<br>
每个对象都有一个监视锁<br>
对象内存结构<br>
对象头
比如 hash码,对象所属的年代,对象锁,锁状态标志,偏向锁(线程)ID,偏向时间,数组长度(数组对象)等
对象实际数据
即创建对象时,对象中成员变量,方法等<br>
对齐填充<br>
对象的大小必须是8字节的整数倍<br>
升级过程1.6以后进行优化,锁升级后,不能降级
无锁
偏向锁
轻量级锁
重量级锁
关键字
volatile
1.是Java虚拟机提供的轻量级的同步机制<br>
2.可见性:保证被volatile修饰过的变量,对所有线程可见;可见性指的是当一个线程修改了变量的值,那么新的<br>值对于其他线程是可以立即获取的。
3.禁止指令重排
实现:通过汇编lock前缀指令,它会锁定变量缓存行区域并写回主内存,这个操作称为“缓存锁定”,缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据。一个处理器的缓存回写到内存内存会导致其他处理器的缓存无效<br>
volatile保证可见性与有序性,但是不能保证原子性,要保证原子性需要借助synchronized、Lock锁机制,同理也能保证有序性与可见性
sychronized
加锁方式<br>
1.同步实例方法,锁当前实例对象
2.同步类方法,锁当前类对象<br>
3.同步代码块,锁括号里的对象<br>
原理
JVM内置锁,通过sychronized,通过内部Monitor(监控锁),MonitorEnter进入,<br>MonitorExit退出,监视锁依赖MutexLock,实现,重量级锁性能较低,<br>
每个对象都有一个监视锁<br>
对象内存结构<br>
对象头
比如 hash码,对象所属的年代,对象锁,锁状态标志,偏向锁(线程)ID,偏向时间,数组长度(数组对象)等
对象实际数据
即创建对象时,对象中成员变量,方法等<br>
对齐填充<br>
对象的大小必须是8字节的整数倍<br>
升级过程1.6以后进行优化,锁升级后,不能降级
无锁
偏向锁
轻量级锁
重量级锁
内存模型
八大操作
lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态<br>
unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定<br>
read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用<br>
load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中<br>
use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎<br>
assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量<br>
store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作<br>
write(写入):作用于工作内存的变量,它把store操作从工作内存中的一个变量的值传送到主内存的变量中<br>
并发编程
三大特性
原子性
可见性
有序性
产生问题
高并发场景下,导致频繁的上下文切换<br>临界区线程安全问题,容易出现死锁的,产生死锁就会造成系统功能不可用<br>其它<br>
0 条评论
下一页