可以使用两个线程访问链接列表中同一对象的不同属性吗?

时间:2012-11-29 11:25:40

标签: java multithreading linked-list

我是多线程系统的新手,对于对象的合适数据结构有疑问。

我有一个具有多个属性的对象图像,其中两个是存储图像数据的字节数组数据和存储状态的int变量状态。

我有某种形式的传送带架构,这意味着有一个摄像机线程将数据存储到图像属性中,然后是转换器线程,然后是处理线程。因此,一个线程必须处理前一个线程的输出。

为避免同步和提高效率,我的想法是拥有一个LinkedList<Image>存储图像对象。网络摄像头线程创建第一个图像对象,指定status = 1(表示正在进行数据写入),如果完成并指向下一个图像,则指定status = 2。以下转换器线程仅读取状态属性,如果它为1则休眠或等待(可以通过网络摄像头线程发出信号),如果为2,则分配状态3并开始工作。完成后,它设置status = 4并继续下一个图像对象。下一个线程再次读取状态,并在状态&lt; 4等等。

最后我的问题是,是否存在由两个不同线程可能同时访问引起的问题,同时确保只有一个是写操作而另一个(读)访问甚至是在不同的属性/变量上进行的(相同的对象)。

1 个答案:

答案 0 :(得分:1)

即使单个线程修改了相同的共享数据,其他线程也只能执行读取,竞争和数据损坏。

请考虑以下事项:

                                   Thread 1                       | Thread 2
                                   ...                            | ...  
--> not atomic!                    start writing shared resource  | ...
--> data state is undefined here   ...                            | read shared resource
                                   end writing shared resource    | ...

如果您可以确保在没有任何额外访问权限(读取或写入)的情况下对相同的共享数据进行写入访问,那么您将无法获得保护。

否则,您需要使用某种锁定机制保护共享资源,例如semaphoremutex。从描述中听起来像是典型的consumer-producer问题,请查看Synchronizing producer, consumer and a producer queue和类似的问题。