异常:从未同步的代码块调用对象同步方法

本文关键字:调用 对象 同步方法 代码 同步 异常 | 更新日期: 2023-09-27 18:15:47

我有几个线程写同一个int。每个线程增加整数值。同步增量操作的简单方法是什么?锁语句只对Object有效,所以我不能使用它。我也试过:

static int number=0;
static void Main(string[] args)
    {
        ThreadStart ts = new ThreadStart(strtThread);
        new Thread(ts).Start();
        new Thread(ts).Start();
        new Thread(ts).Start();
        new Thread(ts).Start();
        new Thread(ts).Start();
        new Thread(ts).Start();
        Console.ReadLine();
    }
    public static void strtThread()
    {
        bool lockTaken = false;
        Monitor.Enter(number,ref lockTaken);
        try
        {
            Random rd = new Random();
            int ee = rd.Next(1000);
            Console.WriteLine(ee);
            Thread.Sleep(ee);
            number++;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally 
        {
            if (lockTaken)
            {
             Monitor.Exit(number);
            }
        }
    }

显示如下错误:

从未同步的代码块调用

对象同步方法。

异常:从未同步的代码块调用对象同步方法

您可以使用Interlocked。在不加锁的情况下自动增加整数的方法:

public static void strtThread()
{
    Interlocked.Increment(ref number);
}

如果你有多个语句,你可以创建一个对象实例,你可以锁定:

private static int number = 0;
private static readonly object gate = new object();
public static void strtThread()
{
    lock (gate)
    {
       number++;
    }    
}

你为什么要用number呢?我想这就是问题所在。试试这个:

static Object locking = new Object();
static void Main(string[] args)
    {
        ThreadStart ts = new ThreadStart(strtThread);
        new Thread(ts).Start();
        new Thread(ts).Start();
        new Thread(ts).Start();
        new Thread(ts).Start();
        new Thread(ts).Start();
        new Thread(ts).Start();
        Console.ReadLine();
    }
    public static void strtThread()
    {
        lock(locking) {
            try
            {
                Random rd = new Random();
                int ee = rd.Next(1000);
                Console.WriteLine(ee);
                Thread.Sleep(ee);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

联锁。Increment提供原子增量。Interlocked类通常"为多个线程共享的变量提供原子操作"。