notebook
  • coding
    • 2016/11/03_sql optimization principle
    • 2017/08/19_docker for gitlab install
    • 2018/02/15_dotnet core
    • 2018/06/16_vs key
    • 2018/09/12_network protocol
    • 2018/10/23_Distributed service framework
    • 2018/10/24_knowledge
    • 2018/11/03_environment deployment
    • 2018/11/23_release nuget package
    • 2018/12/04_free https
    • 2020/04/29_EFmigrationCmdLine
    • 2020/12/18_push docker image to aws
    • 2022/12/16_HttpClient-multipart
    • 2023/02/17_postgresSql-function
    • 2023/03/09_dockerImages_deploy
    • 2023/04/08_word-helper
    • 2023/11/08_tableAndRowLock
  • living
  • playing
Powered by GitBook
On this page

Was this helpful?

  1. coding

2023/11/08_tableAndRowLock

由于锁 Monitor 是线程独占式访问的,所以其对性能的影响还是蛮大的,那有没有一种方式可是实现:允许多个线程同时读数据、只允许一个线程写数据呢

读写锁 ReaderWriterLockSlim 、就是 支持单个写线程和多个读线程的锁

using System;
using System.Collections.Generic;
using System.Threading;

public class LockExample
{
    private static ConcurrentDictionary<string, ReaderWriterLockSlim> tableLocks = new ConcurrentDictionary<string, ReaderWriterLockSlim>();
    private static ConcurrentDictionary<string, ReaderWriterLockSlim> rowLocks = new ConcurrentDictionary<string, ReaderWriterLockSlim>();

    public void LockTable(string tableName)
    {
        ReaderWriterLockSlim tableLock;

        lock (tableLocks)
        {
            if (!tableLocks.TryGetValue(tableName, out tableLock))
            {
                tableLock = new ReaderWriterLockSlim();
                tableLocks.Add(tableName, tableLock);
            }
        }

        tableLock.EnterWriteLock();
    }

    public void UnlockTable(string tableName)
    {
        ReaderWriterLockSlim tableLock;

        lock (tableLocks)
        {
            if (tableLocks.TryGetValue(tableName, out tableLock))
            {
                tableLock.ExitWriteLock();
            }
            else
            {
                Console.WriteLine("Table is not locked.");
            }
        }
    }

    public void LockRow(string rowId)
    {
        ReaderWriterLockSlim rowLock;

        lock (rowLocks)
        {
            if (!rowLocks.TryGetValue(rowId, out rowLock))
            {
                rowLock = new ReaderWriterLockSlim();
                rowLocks.Add(rowId, rowLock);
            }
        }

        rowLock.EnterWriteLock();
    }

    public void UnlockRow(string rowId)
    {
        ReaderWriterLockSlim rowLock;

        lock (rowLocks)
        {
            if (rowLocks.TryGetValue(rowId, out rowLock))
            {
                rowLock.ExitWriteLock();
            }
            else
            {
                Console.WriteLine("Row is not locked.");
            }
        }
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        LockExample lockExample = new LockExample();

        // 锁定表
        lockExample.LockTable("Products");

        // 锁定行
        lockExample.LockRow("1");

        // 解锁行
        lockExample.UnlockRow("1");

        // 解锁表
        lockExample.UnlockTable("Products");
    }
}
Previous2023/04/08_word-helper

Last updated 1 year ago

Was this helpful?