java - 多线程应用程序中的静态方法和数据成员降低内存使用率?

标签 java multithreading

我有一个多线程 Java 应用程序,它需要使用一个库来获取时区。我使用的时区库是 Timeshape

根据其主页,它需要大约 180 MB 的内存,这是一个很大的数目。

我试图尽可能减少内存使用,所以我用静态方法创建了以下类,并将 TimeZoneEngine 设为静态数据成员。现在,如果每个线程都继续调用 getTimezone,那么将使用相同的引擎并且不会创建新的引擎,我的假设是否正确?使用此静态方法和静态数据成员是否是节省内存的好方法?

public class TimeZone {

    static TimeZoneEngine engine = TimeZoneEngine.initialize();

    public static String getTimezone(double lat, double lon) {
        String timeZone = null;

        Optional<ZoneId> zoneId = engine.query(lat, lon);

        if (zoneId.isPresent()) {
            timeZone = zoneId.get().toString();
        }

        return timeZone;
    }

最佳答案

使用静态方法是减少内存占用的常用方法。此方法已编入 Singleton Pattern .另一种非静态方法是将共享对象传递给将使用它的对象的构造函数。例如:

public class TimezoneService {
    public String getTimezone(double lat, double lon) { /* ... */ }
}

public class Foo {

    private final TimezoneService timezoneService;

    public Foo(TimezoneService timezoneService) {
        this.timezoneService = timezoneService;
    }

}

但是请注意,如果多个线程将使用共享对象,则 synchronization 的某个级别或 concurrency需要限制。

关于java - 多线程应用程序中的静态方法和数据成员降低内存使用率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51639087/

相关文章:

c# - SynchronizationContext.Post 到 UI 方法

java - OrientDB 的 ShortestPath 查询太慢

java - ULP计算浮点

java - Android的SettingsActivity中如何让修改密码提示确认?

java - 如何检查两个字符串是否具有相同的字母,但只打印一次相同的字母?

java - Jersey 2.27 无法处理 POST

c# - l versC#多线程问题

c++ - 使用来自 CreateFile 的有效句柄来自 ReadFileEx 的无效句柄错误

java - 中断等待用户输入的线程,然后退出应用程序

java - 使用Java线程从并发访问切换到顺序访问