多线程
文章平均质量分 91
桃李春风一杯酒,江湖夜雨十年灯
钗头风
玉在椟中求善价,钗于匣内待时飞
展开
-
ThreadLocal详解
比如在拦截器中获取用户信息并保存到ThreadLocal中,保存在ThreadLocal中的用户信息在本次请求的“任何方法”中都可以获取到这个用户信息。除了当前线程新开一个子线程去执行其它业务那么在这个子线程中是不能获取到上面存储的用户信息的,因为ThreadLocal是将当前线程作为Key去存取数据的,如果新开一个线程因为保存用户信息的线程和新开的线程不是同一个线程所以在新开的线程中是获取不到这个用户信息的,除非你将当前保存用户信息的线程也传递到子线程业务中使用保存用户信息的线程去获取用户信息;原创 2023-12-29 15:49:53 · 891 阅读 · 0 评论 -
线程池原理及使用
1.反复创建线程开销大;2.过多线程会占用太多内存(执行任务易出现“内存溢出”);3.加快程序响应速度;4.合理利用CPU和内存;5.统一管理线程;原创 2023-12-27 17:14:31 · 973 阅读 · 0 评论 -
线程活跃性问题(死锁、活锁、饥饿)
活锁表示执行任务的线程没有被阻塞,但由于某些条件没有被满足导致重复的去尝试执行任务(失败->尝试->失败),“活锁”与“死锁”的区别在于“死锁”线程一直处于等待状态而“活锁”执行线程在不断的执行;“饥饿”是指线程执行时无法获取到它所需要的资源比如(CPU),一种情况是“线程”优先级分配不合理导致部分线程一直无法被CPU调度执行;另一种情况是某线程持有某个操作的“锁”但其又处于无限循环而又不释放锁,此时其它等待获取此锁的线程获取不到就出现了饥饿问题;饥饿问题会导致服务器响应变差;详见本章序号1、7、8;原创 2023-12-22 14:16:36 · 924 阅读 · 0 评论 -
JVM内存结构&Java内存模型&Java对象模型
JMM是一组规范,需要各个JVM的实现来遵循JMM规范,以便开发者可以利用这些规范更方便的开发多线程程序;如果没有这样一个JMM内存模型来规范,那么很可能经过了不同JVM的不同规则的重排序后,导致不同虚拟机上运行的结果不一样;JMM不仅仅作为一组规范它同时还是“工具类”、“synchronized”、“Lock”等的原理;代码在JVM中的执行顺序和在Java代码中的顺序不一致;(代码指令执行顺序并不是严格按照语句顺序执行的,这就是重排序);指一个线程对共享变量的修改对于其它线程是可见的;原创 2023-12-25 09:47:45 · 1230 阅读 · 0 评论 -
volatile关键字
5.1.volatile适用于一个共享变量自始至终只被各个线程赋值,而没有其它操作(运算或取反等操作),那么就可以使用volatile代替synchronized或者“原子变量”,因为赋值本身是原子性的,而volatile又保证了可见性所以是线程安全的;或者也可以使用volatile作为触发器实现轻量数据同步;5.2.volatile属性的读写操作都是无锁的,它不能替代synchronized因为它没有提供原子性和互斥性因为无锁所以不需要花时间在获取锁和释放锁上所以它是轻量级。原创 2023-12-21 14:25:51 · 506 阅读 · 0 评论 -
线程三(线程属性 && 线程未捕获异常 && 线程安全问题)
true(守护线程)/false(非守护线程也称为:“用户线程”)设置守护线程方法:thread.setDaemon(true)原创 2023-12-18 14:22:17 · 347 阅读 · 0 评论 -
线程二(生命周期 && Object和Thread类方法详解)
1.线程的六种状态 NEW(创建) 线程已创建但还未执行start()方法; Runnable(可运行) 线程调用start()方法便会进入Runnable状态; 备注:线程运行中的状态也是Runnable Blocked(阻塞) 当一个线程进入到被synchronized修饰的代码块时,并且该锁已经被其它线程拿走时,原创 2023-12-18 09:50:35 · 775 阅读 · 0 评论 -
线程一(创建 && 启动 && 中断)
响应中断:即程序在执行下面这些方法时可以感知到中断信号,如果收到中断信号会响应中断。如sleep()方法当执行sleep方法时收到中断信号则线程会抛异常来响应中断java.nio.channels.InterruptibleChannel的相关方法java.nio.channels.Selector的相关方法。原创 2023-12-06 16:04:19 · 773 阅读 · 0 评论