java 中的多线程问题
结论
全局变量 多线程非安全 (堆) static
局部变量 多线程安全 (栈) fina 也可以安全
1:线程调用时 ,每一个线程都拥有一套完整的调用栈帧,栈帧中包含完整的调用方法名,方法的局部变量。而且栈是先入后出,调用方法时入栈,方法结束是出栈。
2:使用线程池时需要注意参数问题 :资料
6参数
ThreadPoolTaskExecutor 创建线程池
corePoolSize 最小核心线程数 (必有)
maxPoolSize 最大线程数 (必有)
keepAliveSeconds 空闲线程存活时间 (必有)
queueCapacity 缓存队列数 (必有)
allowCoreThreadTimeOut 存活线程数能否为0 (必有)
传统7参数
核心线程数
最大线程数
活动线程执行时间
空闲线程存活时间
任务队列类型
线程工厂类型
拒绝策略
3:解决多线程安全问题在于如何解决 堆中变量的值共享问题,可以使用 private final 修饰成员变量,或者使用锁,或者使用threadLocal 变量
threadLocal 原理是 维护了一个 threadLocal map,以threadLocal为key 存储线程变量的值。容易oop,因为使用线程池的时候线程结束并不会直接关闭,会在线程复用的时候读取到上一次未释放的值,所以线程结束时需要使用try finaly threadLocal.remove 释放 也可以使用AutoCloseable自动释放。
加锁使用 方法锁和变量锁
方法锁需要注意获取this锁的时机是否会导致其他线程无法获取锁以解锁导致cpu消耗100%。
本文来自博客园,作者:给香菜送点香菜,转载请注明原文链接:https://www.cnblogs.com/mingkewang/p/17503435.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~