【问题标题】:How @prototype scope helps in multithreading@prototype 作用域如何帮助多线程
【发布时间】:2017-10-20 18:27:32
【问题描述】:

给了我一个单线程应用程序,并要求将其设为多线程。使用了许多单例实例。

我知道当一个单例实例在多个线程之间共享时,该实例的所有变量都会在多个线程之间共享。

比如有一个count变量,它是一个单例实例变量。我的想法是每个线程都应该增加“计数”。每个线程只增加一次。所以计数器应该是1。如果我增加共享对象的这个变量,所有的线程都会得到那个值。所以当第 2 个线程执行它时,值不会是 1,而是 2。对于增加它的第 n 个线程,它看到的值将是 n,而不是 1。

为了防止这种情况,我在该类上使用了原型范围。现在我将为每个线程获取一个新对象,并且每个线程的计数器将保持为 1。

这就是我认为我会使用原型作用域的方式。这有意义吗?我举了一个计数器的例子,在那个共享实例中有很多很多不同类型的变量。 我使用原型是否合理?

【问题讨论】:

    标签: java multithreading spring-boot singleton prototype


    【解决方案1】:

    您可以将局部变量用于上述目的,它不必是实例变量。

    为了防止这种情况,我在该类上使用了原型作用域。现在 我将为每个线程获取一个新对象,并且计数器将保持为 1 每个线程。

    这就是我认为我会使用原型作用域的方式。这是否使 有意义吗?

    这是有道理的,但唯一的问题是,我没有看到实例变量的情况,正如我之前所说,您可以使用局部变量轻松实现这一点。 careful 将原型作用域 bean 注入到单例作用域 bean 中。 Spring Prototype scoped bean in a singleton

    【讨论】:

    • 这不仅仅是一个变量'Counter',而是有很多这样的变量。
    • 如果这些变量不需要在不同线程之间共享,可以是局部变量(方法中包含生命周期的变量)
    • @hars 如果这回答了您的问题,请接受它,这将有助于其他 SO 用户
    • 我的声望不够。
    • 最低声望是“upvoting”。要接受答案,没有最低代表要求。答案的“投票”正下方有一个勾号,点击后将变为绿色。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多