簡體   English   中英

異常:從未同步的代碼塊中調用了對象同步方法

[英]Exception : Object synchronization method was called from an unsynchronized block of code

我有幾個寫入同一int的線程。 每個線程遞增整數值。 同步增量操作的簡單方法是什么? 鎖語句僅對對象起作用,所以我不能使用它。 我也嘗試了以下方法:

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.Increment方法自動增加整數而不進行鎖定:

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);
            }
        }
    }

Interlocked.Increment提供原子增量。 通常, Interlocked類 “為多個線程共享的變量提供原子操作”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM