Java并发:多线程的替代方案(使用非线程安全环境)



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

然后我读了这里的文章

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

建议遵循那篇文章的建议吗?还有什么其他选择?

对Martin James的回应:

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

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

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

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

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

这并不是百分之百清楚。我认为这意味着:

1) 创建组件不是线程安全的。也许它们都存储在一个非线程安全的容器中。据推测,组件的破坏也不是线程安全的。

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

到目前为止,这就是我的看法。也许你的供应商可以确认,只是为了确定,在你进行任何进一步的设计之前。

这一切都取决于代码对组件的实际操作。例如,ArrayList不是线程安全的,但Vector是线程安全的。但是,如果在线程内部使用ArrayList的方式是线程安全的或与线程无关的,那也没关系。例如,您可以在用于web服务的JavaEE容器中使用ArrayLists而不会出现任何问题,因为每个web服务调用都将在其自己的线程上,并且头脑正常的人都不会让web服务处理线程相互通信。事实上,如果可以避免使用Vectors,那么Vectors在JavaEE容器中是非常糟糕的,因为它们在大多数方法上都是同步的,这意味着容器的线程将阻塞,直到完成任何操作。

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

最新更新