Different Different Threads Modifying Different Indices Of A Shared List
Is it a good design to have X different threads modify X different indices of a list or basically X different threads modifying X different properties of a shared object. I considered using synchronised/synchronisedList(any concurrent datastructure) but I want to avoid the performance overhead that comes with it. Does the approach depend on the value of X?
According to this is multiple threads adding to single arraylist might work but it's not a good design, is it the same with this?
In case the answer varies from language to language, I am asking in particular about JAVA, but would want to know why is it that different languages have this differently.
Answer
If we assume that your list has a fixed initial size of let's say 10 elements and you have 10 threads manipulating elements 1 to 10 there is no shared mutual state involved (see shared mutual state is the root of all evil). Thus, I see no big problem with synchronization and would go with the list.
But, keep in mind that this heavily depepends on the operations performed and the size of the list. If you have 1000000 elements inside the list, creating 1000000 threads would be inefficient or even impossible.
Also as soon as you start adding and deleting elements from the list, you have the list itself as shared mutual state and you must now worry about synchronization.
Edit: about shared mutual state
If you shared state that is not mutual you cannot have problems with synchronization because nobody can change the data anyway.
If you have mutual state that is not shared you can change the state but nobody except your current code works on the state anyway, thus the change are directly reflected inside your code.
If you have shared mutual state, your can now have two threads were each one can change the data of the other. In multithreading the order in which this changes happen and a reflected by the reader is not deterministic as long as you do not apply mechanisms such as synchronization or locking. Thus, you can have the classical problems like:
- A reads data from element x and transforms it.
- B reads data from element x and transforms it <-- A has not written its changes yet, thus B works with outdated data
- A writes data to element x
- B writes data to element x <-- A's changes are lost
Related Questions
- → How to update data attribute on Ajax complete
- → October CMS - Radio Button Ajax Click Twice in a Row Causes Content to disappear
- → Octobercms Component Unique id (Twig & Javascript)
- → Passing a JS var from AJAX response to Twig
- → Laravel {!! Form::open() !!} doesn't work within AngularJS
- → DropzoneJS & Laravel - Output form validation errors
- → Import statement and Babel
- → Uncaught TypeError: Cannot read property '__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED' of undefined
- → React-router: Passing props to children
- → ListView.DataSource looping data for React Native
- → Can't test submit handler in React component
- → React + Flux - How to avoid global variable
- → Webpack, React & Babel, not rendering DOM