Volatile keyword indicate that a variable may be modified by multiple thread. It always contain the most updated value. There is no need to use lock statement with volatile variable.
Value will be same for all thread. There is no need to use lock with volatile field.
Fields that are declared volatile are not subject to
compiler optimizations that assume access by a single thread. This ensures that
the most up-to-date value is present in the field at all times.
Value will be same for all thread. There is no need to use lock with volatile field.
For nonvolatile variable, compiler ensures that a variable
accessed by one thread at a time.
Volatile keyword can be used with following types.
1.
Reference type.
2.
Type like sbyte,
byte, int, uint, short, ushort, float, bool,char
3.
Pointer Type, but pointer to volatile not
possible.
4.
An enum type
Life without volatile.
class TestNonVolatile
{
private bool _loop
= true;
public static void
Main()
{
Test test1
= new Test();
// Set _loop
to false on another thread
new Thread(()
=> { test1._loop = false;}).Start();
// Poll the
_loop field until it is set to false
while (test1._loop == true) ;
// The loop
above will never terminate!
}
}
Output:
Loop
will never terminate.
There are two possible ways to get
the while loop to terminate:
- Use a lock to
protect all accesses (reads and writes) to the _loop field
- Mark the _loop field as volatile
When variable is declared volatile it essentially means that
threads should not cache such a variable or in other words threads should not
trust the values of these variables instead they are directly read from the
main memory.
No comments:
Post a Comment