多线程知识点总结
来源:互联网 发布:java的cookie 编辑:程序博客网 时间:2024/05/21 09:12
多线程的问题主要围绕3个问题处理:1.原子性,2.可见性,3.有序性
1.原子性,不可被其他线程打断的操作。如read.write
sychronized
2.可见性:一条线程修改了某值,新值对其他线程立即可知;
普通变量是通过主内存完成多线程的共享,因此在多线程的情况下,很多脏数据。
volatile,sychronized,final
3.有序性:保证多线程的操作顺序同代码执行顺序一致。
如1)i=0,2)j=i,3)i=20.A线程执行1后,才能执行2,然后C执行3,若C指令使3提前执行,则最后结果为i=10,j=10
sychornized,volatile
线程调度:
协同调度,运行结束后,主动通知系统切换到另一个线程上。
缺点:如果不告知,会形成阻塞。
抢占式调度:线程由系统分配时间,线程切换不由线程决定。
线程五个状态:新建、运行、等待、阻塞、结束。
线程安全
当多个线程访问一个对象时,总能获得正确的调用结果。
悲观锁和乐观锁
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,
乐观锁:拿数据的时候都认为别人不会修改,所以不会上锁。如CAS
线程安全实现方法
1.互斥同步
为悲观锁,且阻塞同步。
方法有:临界区,互斥量,信号量。
同步手段:1.sychronized;2.reentraintLock
1.非阻塞同步
为乐观锁。CAS实现。
锁的四种状态:无锁,偏向锁,轻量级锁,重量级锁。
锁优化:
自旋锁,锁消除,锁粗化,轻量级锁,偏向锁。
1.自旋锁:线程发现没有取得锁时,为防止线程频繁切换状态,可以并行两个或者两个以上的线程,使后面的线程等待释放锁(需要让其执行一个循环,即自旋)
2.锁消除:对代码上要求同步,实际上被检测到不可能存在共享数据竞争的锁进行消除。
3.锁粗化:原则上使同步块作用范围尽量小——只在共享数据的实际作用域中才进行同步。但如果没有线程竞争,也频繁进行互斥同步等操作,会导致不必要的性能消耗。此时要把加锁同步范围扩展,即粗化到整个系列外部。
4.轻量级锁:无竞争的情况下使用CAS操作消除同步使用的互斥量
场景:线程交替执行同步块的情况,若同时访问同一锁,会膨胀为重量级锁。
5.偏向锁:把整个同步消掉,进出也没有CAS。锁会偏向于第一个获得它的线程,记录第一次获得锁的线程ID,之后该ID的线程再次进入 这个锁的相关同步块时,虚拟机不再做任何操作,如lock,unlock.当有其他线程尝试获取该锁时,偏向模式结束。
如1)i=0,2)j=i,3)i=20.A线程执行1后,才能执行2,然后C执行3,若C指令使3提前执行,则最后结果为i=10,j=10
sychornized,volatile
- 多线程知识点总结
- OC多线程知识点总结
- Java多线程知识点总结
- 多线程知识点简单总结
- java多线程知识点总结
- 多线程知识点总结
- 多线程知识点总结
- 多线程知识点总结
- Java多线程知识点总结
- 多线程知识点总结(一)
- 多线程知识点总结一
- 多线程知识点总结二
- 多线程知识点总结
- 【多线程】java多线程知识点总结
- java多线程基础知识点总结
- java多线程的知识点总结
- 黑马程序员--多线程知识点总结
- 多线程与并发知识点总结
- myclipse右边代码编辑框不见了
- servlet学习笔记
- [YTU]_2432 (C++习题 对象数组输入与输出)
- 常用 Git 命令
- AngularJS中ngbind指令的用法
- 多线程知识点总结
- String
- WebApplicationContext初始化
- sql中order by对null值的排序
- 深度学习 —— 使用RNN-RBM建模和生成复调音乐序列
- 面向对象领域类图
- 自己实现RPC框架(2)
- 线程同步工具-Semaphore
- Android内存分析命令