This C# lock
-keyword is used in threading. It restricts code from being executed by more than one thread at the same time. This makes threaded programs reliable.
The lock
-statement uses a special syntax form to restrict concurrent access. Lock is compiled into a lower-level implementation based on threading primitives.
The Main
method creates 10 new threads, and then calls Start()
on each one. Please examine method "A" to see the lock statement.
lock
-statement, the methods will be executed all at once, with no synchronization.using System; using System.Threading; class Program { static readonly object _object = new object(); static void A() { // Method A: lock on the readonly object. // ... Inside the lock, sleep for 100 milliseconds. // ... This is thread serialization. lock (_object) { Thread.Sleep(100); Console.WriteLine(Environment.TickCount); } } static void Main() { // Create 10 new threads. for (int i = 0; i < 10; i++) { ThreadStart start = new ThreadStart(A); new Thread(start).Start(); } } }28106840 28106949 28107043 28107136 28107246 28107339 28107448 28107542 28107636 28107745
Let's examine the intermediate representation for the lock
-statement. In compiler theory, high-level source texts are translated to lower-level streams of instructions.
static
methods Monitor.Enter
and Monitor.Exit
.try-finally
construct. This uses the exception handling control flow..method private hidebysig static void A() cil managed
{
.maxstack 2
.locals init (
[0] object obj2)
L_0000: ldsfld object Program::_object
L_0005: dup
L_0006: stloc.0
L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object)
L_000c: ldc.i4.s 100
L_000e: call void [mscorlib]System.Threading.Thread::Sleep(int32)
L_0013: call int32 [mscorlib]System.Environment::get_TickCount()
L_0018: call void [mscorlib]System.Console::WriteLine(int32)
L_001d: leave.s L_0026
L_001f: ldloc.0
L_0020: call void [mscorlib]System.Threading.Monitor::Exit(object)
L_0025: endfinally
L_0026: ret
.try L_000c to L_001f finally handler L_001f to L_0026
}
Lock is a synchronization construct. We looked at an example and stepped into the IL. This keyword is helpful for threaded programs.