我正在使用第三方专有库(无源代码),它创建非线程安全组件的实例。这是否意味着我不应该使用多个线程并行运行作业?在它自己的JVM中运行每个工作都是我的想法,但是有点矫枉过正。
然后我在这里阅读了这篇文章
http://cscarioni.blogspot.com/2011/09/alternatives-to-threading-in-java-stm.html
是否建议遵循该文章的建议?还有哪些其他选择?
对Martin James的回应:
供应商告诉我,只有一个线程存在多个组件实例(用于创建组件实例的工厂模式),并且每个实例都可以从它的API中独立控制。
这是否意味着我仍然可以在控制在一个大线程中运行的每个组件实例时使用多个线程?
答案 0 :(得分:2)
不,这并不意味着这一点。 这意味着您应该自己关心数据保护。一种可能的方法是在调用它的代码(您的代码)中同步对该库的访问。其他可能的方法是使用不可变对象(例如,每次要使用它时都要创建非线程安全数据结构的私有副本。)
其他方法是设计应用程序,使得与特定对象一起使用的代码始终在同一个线程中运行。这并不意味着与其他对象(即使是同一个类)一起工作的代码也无法在其他线程中运行。因此,系统是多线程的,但不会创建数据冲突。
答案 1 :(得分:1)
'供应商告诉我,只有一个线程存在多个组件实例(用于创建组件实例的工厂模式),并且每个实例都可以从它的API中独立控制。'
这并不完全是100%明确的。我认为这意味着:
1)组件的创建不是线程安全的。也许它们都存储在非线程安全容器内部。据推测,组件的破坏也不是线程安全的。
2)一旦创建,组件是“可独立控制的” - 这强烈表明它们是线程安全的。
到目前为止,这是我的看法。在您继续进行设计之前,也许您的供应商可以确认它。
答案 2 :(得分:-2)
这完全取决于您的代码实际对组件执行的操作。例如,ArrayList
不是线程安全的,但Vector
是线程安全的。但是,如果您以线程安全或线程中立的方式在线程内部使用ArrayList,则无关紧要。例如,您可以在用于Web服务的JavaEE容器中使用ArrayLists而不会出现任何问题,因为每个Web服务调用都将在其自己的线程上,并且没有一个心智正常的人会让Web服务处理线程相互通信。实际上,如果你可以避免使用它们,那么在JavaEE容器中的Vectors非常糟糕,因为它们在大多数方法上都是同步的,这意味着容器的线程将阻塞,直到任何操作完成。
正如AlexR所说,你可以同步事物,但最好的方法是真正查看你的代码并弄清楚线程是否实际上是在共享数据和状态,还是在做自己的事情。