java - 如何使用静态变量和线程提高 Java 性能?

标签 java multithreading performance variables static

为了不深入探讨我的软件应该做什么,让我举一个我试图解决的例子,让这个简短而有趣。

假设我有一个名为 X 的基类和该类的一个实现,我将调用 Y。自然地,Y 类扩展了 X 基类。假设我有 20 个对象将通过单独的线程实例化 Y 类对于每个对象和每个实例化,一个大文件都会加载到内存中。其中一些对象可能需要使用不同的文件,但为了简单起见,假设它们都需要访问同一个文件。

有没有办法在基类中定义一个静态指向这些文件的特定对象(变量),这样,即使实现类通过 20 个不同的线程加载了 20 次,它们都可以共享同一个静态对象,这样文件只需要加载一次???

提前感谢您的帮助...

最佳答案

  1. 那个文件是只读的吗?
  2. 这是一串大数据吗?

如果是这样,一个 String 就让它成为一个 protected static final String 并且它是线程安全的。如果它是可变的,那么您的 future 将遭受整个世界的伤害。

如果它是一个二进制文件并且只能以只读方式使用,你可以用 byte[] 代替 String 做同样的事情并确保你不让任何东西改变数组中的字节。更好的方法是以只读方式实现一些 StreamReader 接口(interface)。

使线程安全的最简单和最安全的方法是使其不可变。 final 关键字使引用不可变,但不会使其指向的对象不可变。由于 String 是不可变的,因此 final 也使引用不可变,您就可以开始了。如果您需要在所有线程之间共享更改的可变性,java.util.concurrent 包将是您的 friend 。

如果您将变量设置为 protected static final,则子类的所有实例,无论它们在哪个执行线程上,都将看到数据。

关于java - 如何使用静态变量和线程提高 Java 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5035704/

相关文章:

java - 指定 log4j 日期的时区

Java异常处理不返回值

c++ - QFutureWatcher 如何观察多个任务/ future 和 finished() 信号

java - 如何解决这种多任务场景中任务长时间中断的问题?

c++ - 在 C++ 的头文件中编写函数定义

performance - CPU 上的 Keras LSTM 比 GPU 快?

Java XmlRpc 服务器因 Encodings.isRecognizedEncoding 出现 NoSuchMethodException 失败

java - MapReduce 查找词长频率

C#接口(interface)问题

multithreading - 在valgrind下运行的程序中断时的线程堆栈回溯