我正在开发一个 Java Spring MVC 项目,我对在 Java Spring Bean 中使用实例变量犹豫不决。我想问一些关于这个主题的问题。
我在我的 Java Spring Bean 中使用了一个实例变量,它的类型是 String。
private String abc = "hell";
众所周知,Java Spring 默认作用域是 Singleton,它们是在项目启动时构建的。.它是单实例,我的实例变量必须是线程安全的。
我在bean的方法中使用了这个变量“abc”,当多个线程到达它们时会破坏每个线程的数据一致性吗?
例如,线程 1 到达 bean 并将 abc 变量更改为“hello”。此时,线程 1 引用 abc 变量指向“hell”或“hello”?我对这个话题感到困惑。
我将字符串 abc 变量设置为ThreadLocal
对象,以提供每个线程都保存自己的 abc 变量。但我读过在 Tomcat 中使用ThreadLocal
对象会发生内存泄漏。在 7.0 版本的 Tomcat 之后,据说它是固定的。
因为每个线程都有自己的变量,当它们的工作完成时,它们会返回由容器管理的线程池。但是,返回池,ThreadLocal对象不会被破坏,它们会导致内存泄漏。
此外,String 对象是不可变的,所以在理论上它会导致多线程问题吗?
每个线程都自己保存它们的 String 变量吗?例如,线程 1 触发然后启动方法调用,并创建单独的字符串变量“abc”,线程 2 触发然后它创建新的字符串变量“abc”,它们是否会相互损坏“abc”变量?
我真的很想知道这个用法的概念,并渴望了解答案。