[英]code throws Object synchronization method was called from an unsynchronized block of code
[英]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.