【问题标题】:Java Concurrency: Alternative to Multi Threading (working with non thread safe environment)Java 并发:多线程的替代方案(使用非线程安全环境)
【发布时间】:2012-02-16 11:30:39
【问题描述】:

我正在使用创建非线程安全组件实例的第 3 方专有库(无源代码)。这是否意味着我不应该使用多个线程来并行运行作业?在它自己的 JVM 中运行每项作业我都想到了,但是有点矫枉过正。

然后我在这里阅读了这篇文章

http://cscarioni.blogspot.com/2011/09/alternatives-to-threading-in-java-stm.html

是否建议遵循该文章的建议?还有哪些其他选择?

回复马丁·詹姆斯:

供应商告诉我只有一个线程存在多个组件实例(创建组件实例的工厂模式)并且每个实例都可以通过其 API 独立控制。

那么这是否意味着我仍然可以使用多个线程同时控制在一个大线程中运行的每个组件实例?

【问题讨论】:

  • '创建非线程安全组件的实例'并不一定意味着不能从多个线程使用该库 - 也许它只是为每个线程创建一个组件。文档和/或供应商怎么说?

标签: java multithreading concurrency transactions


【解决方案1】:

不,不是这个意思。 这意味着您应该自己关心数据保护。一种可能的方法是在调用它的代码(您的代码)中同步对该库的访问。其他可能的方法是使用不可变对象(例如,每次您想使用它时都制作非线程安全数据结构的私有副本)。

另一种方法是设计您的应用程序,使与特定对象一起工作的代码始终在同一个线程中运行。这并不意味着与其他对象(即使是同一类)一起工作的代码不能在其他线程中运行。因此,系统是多线程的,但不会产生数据冲突。

【讨论】:

  • 原生 java 风格的同步是使用 synchronized 块/方法完成的,但 java.util.concurrency 包添加了许多非常强大的线程管理工具。
【解决方案2】:

'供应商告诉我,只有一个线程存在多个组件网络实例(创建组件实例的工厂模式),并且每个实例都可以通过其 API 独立控制。'

这并不是 100% 清楚的。我认为它的意思是:

1) 组件的创建不是线程安全的。也许它们都内部存储在非线程安全的容器中。据推测,组件的销毁也不是线程安全的。

2) 一旦创建,组件是“独立可控的”——这强烈表明它们是线程安全的。

到目前为止,这是我的看法。也许您的供应商可以在您继续进行设计之前确认这一点。

【讨论】:

    【解决方案3】:

    这完全取决于您的代码对组件的实际操作。例如,ArrayList 不是线程安全的,但 Vector 是线程安全的。但是,如果您以线程安全或线程中立的方式在线程内使用 ArrayList,则无关紧要。例如,您可以在用于 Web 服务的 JavaEE 容器中毫无问题地使用 ArrayLists,因为每个 Web 服务调用都将在其自己的线程上进行,并且没有人会拥有彼此通信的 Web 服务处理线程。事实上,Vector 在 JavaEE 容器中非常糟糕,如果你可以避免使用它们,因为它们在大多数方法上是同步的,这意味着容器的线程将阻塞,直到任何操作完成。

    正如 AlexR 所说,您可以同步事物,但最好的方法是真正查看您的代码,并确定线程是否真的要共享数据和状态,或者开始做自己的事情。

    【讨论】:

    • 向量不是线程安全的!你不能在一个线程中迭代并在另一个线程中更新它!
    • 我想你可以说它们是线程安全的。在这种情况下,会引发 ConcurrentModificationException。这不像有一个不需要的(隐藏的)副作用。 Vector 类通过使所有方法同步来确保访问和内存可见性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多