2012-02-16 57 views
3

我正在使用第三方专有库(无源代码)创建非线程安全组件的实例。这是否意味着我不应该使用多个线程并行地运行作业?在自己的JVM中运行每个作业都让我想起了它,但是过度使用它。Java并发:替代多线程(使用非线程安全环境)

然后我在这里阅读文章

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

最好先请按照文章的建议吗?那里还有什么其他的选择?

回应马丁詹姆斯:

供应商告诉我,只有一个线程在该组件的多个实例存在(工厂模式创建的组件实例),每个实例独立控制从它的API。

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

+1

'创建非线程安全组件的实例'不一定意味着该库不能用于多个线程 - 也许它只是为每个线程创建一个组件。文档和/或供应商说什么? – 2012-02-16 11:40:05

回答

2

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

其他方法是设计你的应用程序,使用特定对象的代码总是运行在同一个线程中。这并不意味着与其他对象(甚至是同一个类)的代码无法运行int其他线程。所以,系统是多线程的,但不会产生数据冲突。

+0

原生的java风格同步使用'synchronized'块/方法完成,但是'java.util.concurrency'包为线程管理增加了很多非常强大的工具。 – AlexR 2012-02-21 07:24:43

-2

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

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

+0

向量不是线程安全的!您不能在一个线程中迭代并在其他线程中更新它! – 2012-02-16 11:51:53

+0

我认为你可以说他们是线程安全的。在这种情况下会引发ConcurrentModificationException。这不像有一个不需要的(隐藏的)副作用。 Vector类通过使所有方法同步来确保访问和内存可见性。 – 2012-02-16 12:51:48

1

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

这并不完全清楚。我认为它的意思是:

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

2)创建完成后,组件是“可独立控制的” - 这强烈表明它们是线程安全的。

到目前为止,这是我的承担。也许你的供应商可以确认它,只是可以肯定的是,在你继续进行设计之前。