【发布时间】:2017-02-10 06:25:22
【问题描述】:
我正在编写一个 REST 客户端,它有一个具有固定过期时间的访问令牌。
如何确保在过期时间之前请求新令牌?我看到两个选项:
- Timer
- 一些使用finalize 方法的恶作剧可能使用ref package
1) 将要求我创建一个在给定时间内运行并请求新令牌的新线程。这对我来说似乎很浪费。
2) 将利用无论如何都会运行的 GC 线程,因此我不需要创建新线程。当finalize 运行时,只需检查令牌是否即将过期,如果是则请求一个新的,如果在下一个 GC 循环运行之前再次使对象可用。
评论或其他想法?
【问题讨论】:
-
GC thread which will run anyways。这可能并不总是正确的。 GC 仅在需要运行时才由 JVM 运行。如果您的应用程序有足够的可用内存,则可能根本不会触发 GC。所以,我建议不要依赖这种方法。 -
每当我有两种选择,而另一种是“一些恶作剧”时,我总是会这样做。让代码更有趣⸮
-
仍然过早的优化或者在这种情况下过早的聪明不是一个好主意。仅仅因为某件事似乎是浪费的,并不能很好地表明它是否是一个好主意。如果您正在创建 1 个计时器,您甚至不需要考虑它。如果您有 1000 个并且它们正在造成性能损害,那么您需要考虑替代方案。即便如此,明智的做法是坚持使用久经考验的解决方案,而不是滥用 GC 功能自行开发。
-
不要使用定稿!它是一种微妙的野兽,具有可怕的副作用,具有特定的用例和需求。不只是使用终结器来管理资源。
-
您不能依赖
finalize()处理任何事情,更不用说依赖时间的操作了。它可能永远不会运行。
标签: java multithreading performance timer garbage-collection