gpt4 book ai didi

单例作用域类方法中的 Java 线程安全

转载 作者:行者123 更新时间:2023-11-29 07:10:39 25 4
gpt4 key购买 nike

所以我有一个 Singleton 类,其中有一个由多个线程调用的非静态公共(public)方法。在非静态方法中,我有对存储过程创建的对象的本地引用,我推测这意味着“new”关键字在某处被调用。

 1 public void someMethod(SomeObjectParameter parameter) {
2
3 Thing thingOne = synchornizedStoredProcedureCall():
4 doSomethingWith(thingOne);
5 doSomethingElseWith(thingOne);
6
7 }

目前第 3 行到第 5 行在一个同步代码块中,我想将其缩减为仅将存储过程调用同步。

所以...假设我们有两个线程,Thread1 和 Thread2。 Thread1 即将执行第 3 行,Thread2 即将执行第 4 行。由于这是本地引用,每个线程是否会维护不同的引用,或者 synchornizedStoredProcedureCall 会覆盖对 thingOne 的引用,因为 doSomethingWith 将要使用它?

如果 thingOne 被声明为 final 或者我让它不可变会怎样?

最佳答案

will each thread maintain a different reference or will synchornizedStoredProcedureCall overwrite the reference to thingOne as doSomethingWith is about to use it?

不同的线程有不同的堆栈。 thingOne 存储在每线程堆栈中,因此不能被其他线程覆盖。您还需要确保 synchornizedStoredProcedureCall() 每次都返回不同的 Thing 实例,而不是 static 或实例变量。两个线程都需要处理不同的 Thing 实例。

只要 doSomethingWith(...)doSomethingElseWith(...) 调用是线程安全的并且只适用于 thingOne参数和常量(等),保护 只是 synchornizedStoredProcedureCall() 应该没问题。

正如@Marko 所指出的,如果没有看到 Thing 类,我们无法保证它是线程安全的并且不存储内部状态。

关于单例作用域类方法中的 Java 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14161395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com