在一個項目即時通訊使用線程。我試圖做一個安全的線程,dosn't'腐敗'的數據。我的線程在後臺運行,並在另一個類上調用函數,我可以調用Go和Go2,一個函數添加,一個從列表中刪除。我不希望他們在同一時間運行,就是下面的情況之間的差異:鎖定傳遞對象發生了什麼?
static readonly object _locker1 = new object();
static readonly object _locker2 = new object();
public void Go(Object something)
{
lock (_locker1)
{
myList.add(something);
}
}
public void Go2(Object something)
{
lock (_locker2)
{
myList.Remove(something);
}
}
如果我將其替換GO 2:
public void Go2(Object something)
{
lock (_locker1)
{
myList.Remove(something);
}
}
注鎖定參數。
第三種情況會幫助我理解,可以說我從另一個線程(線程2)調用Go,它可以運行,因爲_locker1被thread2鎖定,而Go2(其中_locker 1被thread2鎖定)是從thread1調用?
static readonly object _locker1 = new object();
static readonly object _locker2 = new object();
public void Go(Object something)
{
lock (_locker1)
{
//Can I call Go2 which is locked by the same object?
Go2(something);
}
}
public void Go2(Object something)
{
lock (_locker1)
{
myList.Remove(something);
}
}
有人可以解釋傳遞給鎖的值是什麼嗎?
@cecilloPardo可以說我打電話Go和後來的Go2(而Go沒有完成)它只是等Go完成或跳過Go2,因爲它被鎖定了? –
在第一種情況下,Go2 Go2會同時運行。在第二種情況下,執行將停止在Go2的鎖定語句中,直到Go1的鎖定語句結束。 –
@cecilo謝謝!如果我在情景2中打電話給Go2,我是否會造成死鎖? –