Click here to Skip to main content
12,077,332 members (44,634 online)
Rate this:
 
Please Sign up or sign in to vote.
See more: C#3.5 threads
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 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 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)

  Print Answers RSS
Top Experts
Last 24hrsThis month


Advertise | Privacy | Mobile
Web01 | 2.8.160212.1 | Last Updated 19 Aug 2010
Copyright © CodeProject, 1999-2016
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