温馨提示×

C#中synchronized关键字的最佳实践

c#
小樊
82
2024-09-08 23:43:12
栏目: 编程语言

在C#中,synchronized 并不是一个关键字

  1. 使用 lock 语句:

    当你需要保护代码块以防止多线程同时访问共享资源时,可以使用 lock 语句。lock 语句会获取给定对象的独占锁,确保在同一时间只有一个线程能够执行该代码块。

    private readonly object _lockObject = new object();
    
    public void SomeMethod()
    {
        lock (_lockObject)
        {
            // 临界区代码
        }
    }
    
  2. 使用 Monitor 类:

    Monitor 类提供了更多的同步原语,如 EnterExitWaitPulse。这些方法可以用于实现更复杂的同步场景。

    private readonly object _lockObject = new object();
    
    public void SomeMethod()
    {
        Monitor.Enter(_lockObject);
        try
        {
            // 临界区代码
        }
        finally
        {
            Monitor.Exit(_lockObject);
        }
    }
    
  3. 使用并发集合:

    对于一些特定的数据结构,如列表、字典等,.NET 提供了线程安全的并发集合。这些集合内部已经实现了同步机制,因此可以直接在多线程环境中使用。

    private ConcurrentDictionary<int, string> _concurrentDictionary = new ConcurrentDictionary<int, string>();
    
    public void AddOrUpdate(int key, string value)
    {
        _concurrentDictionary.AddOrUpdate(key, value, (k, oldValue) => value);
    }
    
  4. 使用 SemaphoreSlimSemaphore 类:

    当你需要限制同时访问某个资源的线程数量时,可以使用 SemaphoreSlimSemaphore 类。这些类允许你控制同时进入临界区的线程数量。

    private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(5);
    
    public async Task SomeMethodAsync()
    {
        await _semaphore.WaitAsync();
        try
        {
            // 临界区代码
        }
        finally
        {
            _semaphore.Release();
        }
    }
    
  5. 使用 ReaderWriterLockSlimReaderWriterLock 类:

    当你需要在多线程环境中实现读写分离时,可以使用 ReaderWriterLockSlimReaderWriterLock 类。这些类允许多个线程同时读取共享资源,但在写入时会阻止其他线程访问。

    private readonly ReaderWriterLockSlim _readerWriterLock = new ReaderWriterLockSlim();
    
    public void ReadData()
    {
        _readerWriterLock.EnterReadLock();
        try
        {
            // 读取共享资源
        }
        finally
        {
            _readerWriterLock.ExitReadLock();
        }
    }
    
    public void WriteData()
    {
        _readerWriterLock.EnterWriteLock();
        try
        {
            // 修改共享资源
        }
        finally
        {
            _readerWriterLock.ExitWriteLock();
        }
    }
    

总之,在C#中,没有 synchronized 关键字,但有许多其他同步原语可以用来保护共享资源。根据你的需求选择合适的同步机制,确保在多线程环境中正确地同步代码。

0