读写锁ReaderWriterLockSlim
对于读锁:获取读锁后、其他线程可再获取读锁、但其他线程不能获取写锁(直到所有读锁释放)
如下代码示例:
using System;
using System.Threading;
namespace ReaderWriterDemo
{
internal class Program
{
static void Main(string[] args)
{
TestReadeWriterLock testReadeWriterLock = new TestReadeWriterLock();
for (int i = 0; i < 3; i++)
{
Thread threadr = new Thread(() =>
{
testReadeWriterLock.Read();
});
threadr.Start();
}
//保证上面已经获取读锁
Thread.Sleep(100);
for (int i = 0; i < 5; i++)
{
Thread thread = new Thread(() =>
{
testReadeWriterLock.Add();
});
thread.Start();
}
Console.ReadLine();
}
}
public class TestReadeWriterLock
{
private readonly ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();
private int sum;
public void Add()
{
try
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 等待获取写锁");
lockSlim.EnterWriteLock();
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 成功获取写锁");
for (int i = 0; i < 50000; i++)
{
sum++;
}
}
catch (Exception ex)
{
}
finally
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 写入完成");
lockSlim.ExitWriteLock();
}
}
public void Read()
{
try
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 等待获取读锁");
lockSlim.EnterReadLock();
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 成功获取读锁");
Thread.Sleep(2000);
}
catch (Exception ex)
{
}
finally
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 读取完成");
lockSlim.ExitReadLock();
}
}
}
}
运行结果

对于写锁:获取写锁后、其他线程不能再获取读锁和写锁、知道写锁释放其他读、写线程才有机会
using System;
using System.Threading;
namespace ReaderWriterDemo
{
internal class Program
{
static void Main(string[] args)
{
TestReadeWriterLock testReadeWriterLock = new TestReadeWriterLock();
for (int i = 0; i < 5; i++)
{
Thread thread = new Thread(() =>
{
testReadeWriterLock.Add();
});
thread.Start();
}
//保证上面已经获取写锁
Thread.Sleep(100);
for (int i = 0; i < 3; i++)
{
Thread threadr = new Thread(() =>
{
testReadeWriterLock.Read();
});
threadr.Start();
}
Console.ReadLine();
}
}
public class TestReadeWriterLock
{
private readonly ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();
private int sum;
public void Add()
{
try
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 等待获取写锁");
lockSlim.EnterWriteLock();
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 成功获取写锁");
Thread.Sleep(2000);
for (int i = 0; i < 50000; i++)
{
sum++;
}
}
catch (Exception ex)
{
}
finally
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 写入完成");
lockSlim.ExitWriteLock();
}
}
public void Read()
{
try
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 等待获取读锁");
lockSlim.EnterReadLock();
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 成功获取读锁");
Thread.Sleep(200);
}
catch (Exception ex)
{
}
finally
{
Console.WriteLine($"{DateTime.Now:HH:mm:ss fff} {Thread.CurrentThread.ManagedThreadId} 读取完成");
lockSlim.ExitReadLock();
}
}
}
}

泳池你在游的时候,别人也可以游 ;但是只有等没人游的时候才能放水或清洗;当在放水的时候,清洗或者游泳这些都不能再进行。

浙公网安备 33010602011771号