8.4 Volatile fields


Like Java, C# has a volatile keyword for modifying fields only. This special modifier is usually used only in multi-threaded programming. Threads might cache the values of member fields for efficiency and, since threads can share the same field, it might be possible that a particular thread's cache field value is out of sync with the actual field's value. This is especially so if other concurrently running threads update the field of a shared object.

In both Java and C#, declaring a field as volatile tells the compiler that it should not attempt to perform optimizations (such as caching) on the field. The system always reads the current (latest) value of a volatile field at the point it is requested , and writes the value of the field immediately on assignment.

You declare a field as volatile by inserting the volatile keyword in front, as with all other modifiers. The following statement declares temp as a public static int variable which is also volatile: public static volatile int temp;

Like Java

  • You inform the compiler not to optimize a shared field by declaring it as volatile.

  • You should declare fields which are shared by multiple concurrently-running threads as volatile “ this is especially so if this field is not synchronized within a lock block. [8]

    [8] A C# lock block is similar to a synchronized block in Java. A locked block is protected by an object mutex, and can only be assessed by any single thread at only one time. See Chapter 17.

Additional notes

  • A volatile field cannot be passed to a ref or out parameter of a method (see section 7.2.2).

    The following will cause a compilation error:

     1: class TestClass{  2:    private  volatile  int MyInt;  3:  4:    public void DoThis(  ref  int i){  5:    }  6:  7:    public static void Main(){  8:      TestClass tc = new TestClass();  9:      tc.MyInt = 3; 10:     tc.DoThis(  ref  tc.MyInt); 11:   } 12:  } 

    Compilation error:

     test.cs(10,19): error CS0676: Cannot pass volatile field 'TestClass.MyInt' as ref or out, or take its address 
  • A volatile field cannot be read-only as well. The following declaration results in the compilation error ' A field can not be both volatile and readonly' :

     public readonly volatile bool b; 

    Likewise, you cannot declare a constant as volatile. [9]

    [9] A volatile constant doesn't make sense since you cannot change a constant's value.

  • The type of a field marked as volatile can only be of the following:

    - any reference type;

    - a pointer type (within an unsafe context) “ see section 9.1;

    - the following simple (primitive) types only: sbyte , byte , short , ushort , int , uint , char , float , bool ;

    - an enum (see Chapter 25) type with an enum base type of sbyte , byte , short , ushort , int and uint .



From Java to C#. A Developers Guide
From Java to C#: A Developers Guide
ISBN: 0321136225
EAN: 2147483647
Year: 2003
Pages: 221
Authors: Heng Ngee Mok

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net