|
|
|
Sponsored Link •
|
|
Advertisement
|
Read/write conflicts
Another kind of misbehavior that may be exhibited in a multithreaded
environment by instances of this RGBColor class is
read/write conflicts. This kind of conflict arises when an object's
state is read and used while in a temporarily invalid state due to the
unfinished work of another thread.
For example, note that during the blue thread's execution of the
setColor() method above, the object at one point finds
itself in the temporarily invalid state of black. Here, black is a
temporarily invalid state because:
RGBColor
object. The blue thread is supposed to turn a green object into blue.
If the blue thread is preempted at the moment the object represents
black by a thread that invokes getColor() on the same
object, that second thread would observe the RGBColor
object's value to be black.
Here's a table that shows a sequence of events that could lead to just such a read/write conflict:
| Thread | Statement | r | g | b | Color |
| none | object represents green | 0 | 255 | 0 | |
| blue | blue thread invokes setColor(0, 0, 255) | 0 | 255 | 0 | |
| blue | checkRGBVals(0, 0, 255); |
0 | 255 | 0 | |
| blue | this.r = 0; |
0 | 255 | 0 | |
| blue | this.g = 0; |
0 | 255 | 0 | |
| blue | blue gets preempted | 0 | 0 | 0 | |
| red | red thread invokes getColor() | 0 | 0 | 0 | |
| red | int[] retVal = new int[3]; |
0 | 0 | 0 | |
| red | retVal[0] = 0; |
0 | 0 | 0 | |
| red | retVal[1] = 0; |
0 | 0 | 0 | |
| red | retVal[2] = 0; |
0 | 0 | 0 | |
| red | return retVal; |
0 | 0 | 0 | |
| red | red thread returns black | 0 | 0 | 0 | |
| blue | later, blue thread continues | 0 | 0 | 0 | |
| blue | this.b = 255 |
0 | 0 | 0 | |
| blue | blue thread returns | 0 | 0 | 255 | |
| none | object represents blue | 0 | 0 | 255 |
As you can see from this table, the trouble begins when the blue thread
is interrupted when it has only partially finished painting the object
blue. At this point the object is in a temporarily invalid state of
black, which is exactly what the red thread sees when it invokes
getColor() on the object.
|
Sponsored Links
|