【问题标题】:Limiting creation Of Object in multithreading in java [closed]在java中的多线程中限制对象的创建[关闭]
【发布时间】:2021-09-02 14:58:30
【问题描述】:

在一次采访中,question 被问到。

我们有10 thread100 task。每个任务箱Objects。当资源被高度使用时,我们必须限制Object creation 的数量。他们问

  1. 您将如何识别,因为object getting created 如此之多,因此您的资源被高度使用。
  2. 当资源被高度使用时,您将如何限制creation of object
  3. 由于object getting created很多,当它们被闲置时,gc()也在行动。有时它会抛出错误gc used exceeded

我试过但无法正确回答。他们拒绝了。

您能指导我思考解决方案吗?我的意思是我什至没有得到它的线索。

【问题讨论】:

  • 公司名称我已经改了,但是公司是同一级别的,或者你可以说比亚马逊更大的品牌:)
  • [无论是哪家公司] 是否要求你不要讨论你在面试中听到的事情?
  • 公司无所谓。而给出“更大”之类的细节听起来只是在吹牛,让我们找出它是哪家公司。不管怎样,这对你不利。
  • 这类问题的问题在于,唯一能知道“正确”答案的人是面试官问你的。那些面试官通常想要的是至少听到/看到你对这个问题的看法。 eG:如果你说第一步是回到绘图板上,看看有没有比创建数千个临时对象只让 GC 立即处理它们更好的解决方案,他们可能会很高兴。或者也许他们会讨厌这个答案。问题是我们真的不知道他们对一个好的答案的期望是什么。
  • @OHGODSPIDERS 真的..非常感谢。

标签: java multithreading object java-8 concurrency


【解决方案1】:

如果您创建的对象属于特定类,您可以在该类中使用静态变量来保存已创建实例的数量。例如,您可以使用 AtomicInteger 来保存已创建实例的数量,因此您无需手动同步对该变量的访问。

您可以限制查看该变量的实例数,您可以在调用 new 运算符之前或在调用它之前查看 AtomicInteger 的当前值

代码可能类似于:

 public MyClass {
     private static AtomicInteger counter = new AtomicInteger(0);

     public MyClass() {
         if (counter.getAndIncrement() > 100000) {
             throw new RuntimeException("More than 100000 objects created");
         }
     }

 }

【讨论】:

  • 谢谢大卫。但这里我们用特定数量限制对象。不是每次资源都会很忙。我们可以让它动态吗?他们建议使用 ThreadLocal。我不知道 ThreadLocal 会有所帮助。
  • 您可以使用 ThreadLocal(保存整数)而不是 AtomicInteger。在这种情况下,具有类似的逻辑,您可以限制每个线程而不是每个 JVM 创建的实例数,但问题通常是每个 JVM 的内存大小,而不是每个线程这就是我使用 AtomicInteger 而不是线程本地
  • 谢谢大卫
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2017-09-05
  • 2018-03-18
  • 2014-12-10
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多