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%。

posted @   给香菜送点香菜  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示