Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: C#3.5 Threading
class ThreadSafe
{
  public static readonly object _locker = new object();
  public static int _val1;
  public int _val2 = 1;
  public void Go()
  {
    lock (_locker)
    {
      if (_val2 != 0) Console.WriteLine (_val1 / _val2);
      _val2 = 0;
    }
  }
}
In the above example is it possible for another thread to change the values of _val2 and _val1?
Posted 19-Aug-10 0:28am
piushs131
Edited 19-Aug-10 0:31am
v2

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

The lock keyword locks only access to the code section, not the data used inside of it. This means that it is possible for another thread to modify both _val1 and _val2 even when the locked section is executed.
 
Hope this helps,
Fredrik
  Permalink  
Comments
piushs at 19-Aug-10 6:24am
   
Hi Fredrik
Thanks for your reply.
If such is the case, then how does locking satisfy the purpose of synchronisation? I mean, here i am trying to use "lock" on _locker object to avoid "division by zero" error, just in case, if two different threads are trying to access the code block and change the value of _val2 to zero.
 
Now if the _val2 can be modified by another thread and changed to zero, then i find above locking useless.
Please help me as i am a bit confused with locking.
CPallini at 19-Aug-10 6:33am
   
You should provide syncrhonized accessors to _val1, _val2, not expose them as public variables.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



Advertise | Privacy | Mobile
Web04 | 2.8.1411022.1 | Last Updated 19 Aug 2010
Copyright © CodeProject, 1999-2014
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100