多线程中锁的使用

本文转自:http://www.2cto.com/kf/201401/274446.html

主要介绍下C#的两种锁:互斥锁(lock)和读写锁(ReadWriteLock)

互斥锁(lock)

lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。当任何一个线程获取到锁后,其他线程如果需要使用该临界区内代码,则必须等待前一个线程使用完毕后释放锁。

代码示例:

Object thisLock = new Object();
lock (thisLock)
{
// 临界区代码块
}

读写锁(ReadWriteLock)

ReadWriteLock定义支持单个写线程和多个读线程的锁。该锁的作用主要是解决并发读的性能问题,使用该锁,可以大大提高数据并发访问的性能,只有在写时,才会阻塞所有的读锁。

示例代码:

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

namespace FYSTest
{
  public partial class MainWindow : Window
  {
    List list = new List();
    private ReaderWriterLock _rwlock = new ReaderWriterLock();

    public MainWindow()
    {
      InitializeComponent();
      Thread ThRead = new Thread(new ThreadStart(Read));
      ThRead.IsBackground = true;
      Thread ThRead2 = new Thread(new ThreadStart(Read));
      ThRead2.IsBackground = true;
      Thread ThWrite = new Thread(new ThreadStart(Write));
      ThWrite.IsBackground = true;
      ThRead.Start();
      ThRead2.Start();
      ThWrite.Start();
    }

    private void Read()
    {
      while (true)
      {
        //使用一个 System.Int32 超时值获取读线程锁。
        _rwlock.AcquireReaderLock(100);
        try
        {
          if (list.Count > 0)
          {
            int result = list[list.Count - 1];
          }
        }
        finally
        {
          //减少锁计数,释放锁
          _rwlock.ReleaseReaderLock();
        }
      }
    }

    int WriteCount = 0;//写次数
    private void Write()
    {
      while (true)
      {
        //使用一个 System.Int32 超时值获取写线程锁。
        _rwlock.AcquireWriterLock(100);
        try
        {
          list.Add(WriteCount++);
        }
        finally
        {
          //减少写线程锁上的锁计数,释放写锁
          _rwlock.ReleaseWriterLock();
        }
      }
    }
  }
}
时间: 2024-11-10 01:08:12

多线程中锁的使用的相关文章

Object-C 多线程中锁的使用-NSLock

在多线程的编程环境中,锁的使用必不可少! 于是,今天来总结一下为共享资源加锁的操作方法. 一.使用synchronized方式 //线程1 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @synchronized (_myLockObj){ [obj1 method1]; sleep(30); } @synchronized (obj1){ } }); //线程2 dispatch

python多线程中锁的概念

python的锁可以独立提取出来 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([timeout]) #释放 mutex.release() 概念 好几个人问我给资源加锁是怎么回事,其实并不是给资源加锁, 而是用锁去锁定资源,你可以定义多个锁, 像下面的代码, 当你需要独占某一资源时,任何一个锁都可以锁这个资源 就好比你用不同的锁都可以把相同的一个门锁住是一个道理 import thr

多线程中锁的概念python

好几个人问我给资源加锁是怎么回事,其实并不是给资源加锁, 而是用锁去锁定资源,你可以定义多个锁, 像下面的代码, 当你需要独占某一资源时,任何一个锁都可以锁这个资源 就好比你用不同的锁都可以把相同的一个门锁住是一个道理 #coding: utf-8 import threading import time counter = 0 counter_lock = threading.Lock() #只是定义一个锁,并不是给资源加锁,你可以定义多个锁,像下两行代码,当你需要占用这个资源时,任何一个锁都

多线程中锁的种类。

1. 可重入锁 ReentrantLock 和 synchronized 都是可重入锁. 1 class Main{ 2 public synchronized void method1() { 3 method2(); 4 } 5 6 public synchronized void method2() { 7 8 } 9 } 在method1中会调用另外一个synchronized方法method2,此时线程不必重新去申请锁,而是可以直接执行方法method2.如果不具有可重入性,则会造成死

c#语言-多线程中的锁系统

介绍 平常在多线程开发中,总避免不了线程同步.这次就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 二: mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) { Console.Wri

c#语言-多线程中的锁系统(一)

介绍 平常在多线程开发中,总避免不了线程同步.本篇就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 4:monitor使用 二:mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) {

Java多线程中的竞争条件、锁以及同步的概念

竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生"竞争条件"的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作是非"原子化"的,可能前一个线程对数据的操作还没有结束,后一个线程又开始对同样的数据开始进行操作,这就可能会造成数据结果的变化未知. package com.huojg.test; public class TestThread { public static void

(单例设计模式中)懒汉式与饿汉式在多线程中的不同

/* 目的:分析一下单例设计模式中,懒汉式与饿汉式在多线程中的不同! 开发时我们一般选择饿汉式,因为它简单明了,多线程中不会出现安全问题! 而饿汉式需要我们自己处理程序中存在的安全隐患,但是饿汉式的程序技术含量更高! */ /* class SinglePerson implements Runnable{ private static SinglePerson ss = new SinglePerson("hjz", 22);//恶汉式 private int age; privat

谨慎使用多线程中的fork

前言 在单核时代,大家所编写的程序都是单进程/单线程程序.随着计算机硬件技术的发展,进入了多核时代后,为了降低响应时间,重复充分利用多核cpu的资源,使用多进程编程的手段逐渐被人们接受和掌握.然而因为创建一个进程代价比较大,多线程编程的手段也就逐渐被人们认可和喜爱了. 记得在我刚刚学习线程进程的时候就想,为什么很少见人把多进程和多线程结合起来使用呢,把二者结合起来不是更好吗?现在想想当初真是too young too simple,后文就主要讨论一下这个问题. 进程与线程模型 进程的经典定义就是