为了不深入探讨我的软件应该做什么,让我举一个我试图解决的例子,让这个简短而有趣。
假设我有一个名为 X 的基类和该类的一个实现,我将调用 Y。自然地,Y 类扩展了 X 基类。假设我有 20 个对象将通过单独的线程实例化 Y 类对于每个对象和每个实例化,一个大文件都会加载到内存中。其中一些对象可能需要使用不同的文件,但为了简单起见,假设它们都需要访问同一个文件。
有没有办法在基类中定义一个静态指向这些文件的特定对象(变量),这样,即使实现类通过 20 个不同的线程加载了 20 次,它们都可以共享同一个静态对象,这样文件只需要加载一次???
提前感谢您的帮助...
最佳答案
- 那个文件是只读的吗?
- 这是一串大数据吗?
如果是这样,一个 String
就让它成为一个 protected static final String
并且它是线程安全的。如果它是可变的,那么您的 future 将遭受整个世界的伤害。
如果它是一个二进制文件并且只能以只读方式使用,你可以用 byte[]
代替 String
做同样的事情并确保你不让任何东西改变数组中的字节。更好的方法是以只读方式实现一些 Stream
或 Reader
接口(interface)。
使线程安全的最简单和最安全的方法是使其不可变。 final
关键字使引用不可变,但不会使其指向的对象不可变。由于 String
是不可变的,因此 final
也使引用不可变,您就可以开始了。如果您需要在所有线程之间共享更改的可变性,java.util.concurrent
包将是您的 friend 。
如果您将变量设置为 protected static final
,则子类的所有实例,无论它们在哪个执行线程上,都将看到数据。
关于java - 如何使用静态变量和线程提高 Java 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5035704/