- 博客(6)
- 收藏
- 关注
原创 volatile关键字原理分析
为什么多线程会造成线程不安全 cpu缓存 由于磁盘io、内存io耗费时间比较多,为了提高cpu利用率,做了3级cpu缓存,L1、L2、L3 - 这就会导致多核cpu中操作不同数据,对其它cpu中内容是不可见的 - 比如cpu1从内存中读取了i=1,进行i+1操作 - 当这个操作的内容还没有放到内存中时,cpu2读取的i还是等于1 于是cpu为了解决这个问题引入了总线锁和缓存锁 - 总线锁:锁内存与cpu之间交互的过程,粗粒度锁,一旦锁住整个内存都被锁住 - 缓存锁:只锁住cpu操作的这个缓存
2021-06-19 21:21:08
172
原创 线程锁级synchronize分析
为什么要有线程锁 多线程修改同一个共享资源或者变量时会存在线程安全的问题,比如a线程修改i值为1,b线程修改i值为2,因为线程运行是异步的,这就会造成一个问题,当a先运行结束i值就为1,反之i就为2,这就造成了不确定性,会来带一系列的问题 有哪些线程锁 1.乐观锁:cas操作,自旋通过对比原来的值来修改为新的值,线程一直运行 2.悲观锁:直接加锁,造成阻塞 3.重入锁:一个线程多次获得锁,当线程调用加锁的A方法,而A又调用加锁的B方法就需要重入 4.共享锁:读锁,每个锁都不互斥,相当于无锁 5.读写锁:同时
2021-06-19 16:15:24
157
原创 线程日志分析方法
cpu占用率不高,响应很慢 1.通过jps命令查看java线程的pid 2.通过jsack查看线程日志 如果日志出现Found one Java-level deadlock代表出现死锁 cup占用率很高 1.top -c 显示进程占用资源排行榜,拿到pid 2.通过 top -H -p pid查看该进程中消耗cpu靠前的线程级占用状况 3.通过printf “0x%x\n” 线程pid,转换成16进制的pid 4.使用jstack pid查看日志 ...
2021-06-19 00:22:00
751
原创 线程的原理分析
线程的由来 进程的开销比较大,cpu切换很耗时间,一个进程中也需要多个任务同时进行,例如一个浏览器可以打开多个页面进行浏览操作,一个页面又可以通过异步渲染来提升用户体验度 线程的就是最细力度的cpu运行单位,为了提高运行效率和减少资源占用 线程创建的几种方式 1.继承thread类,java类只能继承一个类 2.实现runnable接口,底层也是实现的Thread类, java类可以多实现,因此多用这种方式 3.实现callable/future,带返回值的线程 4.线程池创建 线程的六种状态 1.NEW
2021-06-18 23:41:52
174
原创 线程池的原理分析
线程池的原理分析为什么要用线程池常见的几种线程池及创建方式线程池的原理分析线程池运行过程中的疑问线程池参数的一些思考 为什么要用线程池 线程高并发时期的创建与销毁都需要消耗大量的性能,线程的创建、销毁与数量无法管控 使用线程池可以有效的管理线程,提高运行速度与效率 常见的几种线程池及创建方式 Executors.newFixedThreadPool(poolSize); //固定大小线程池 Executors.newCachedThreadPool(); //可缓存线程池 Executors.newSing
2021-06-18 01:04:29
92
原创 netty的byteBuf
1.byteBuf是什么 byteBuf是netty对nio的byteBuffer的现实,因为byteBuff使用场景有限 2.byteBuf类关系图 3.为什么netty要用bytebuf来替换bytebuffer 1.使用readIndex和writeIndex来解决每次读写时需要进行flip操作的问题 简化了读写的操作,读有读的指针,写有写的指针,互补干扰 2.封装了每次put需要进行可写空...
2019-10-14 19:35:03
461
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人