在服務器上的應用程序,我需要分配給每個連接的客戶端的唯一的ID,所以我做這種方式:2對鎖的性能問題/使用
private short GetFreeID()
{
lock (this.mUsedPlayerIDsSynchronization)
{
for (short I = 1; I < 500; I++)
{
if (ClientIDPool[I] == false)
{
ClientIDPool[I] = true;
return I;
}
}
return -1;
}
}
我的第一個問題:難道做更高效,我的意思是更好的表現?我在這裏讀到,我們應該學會編寫沒有鎖的代碼。我也讀過一些原子操作還有其他選項。 第二個問題:如果我想鎖定整個班級以便不允許在其中進行任何更改,該怎麼辦?例如:一個客戶端會更新第二個客戶端數據,我可以鎖定整個第二個客戶端類別,它是絕對被阻止的嗎?我仍然認爲「鎖定」只會確保其代碼段中的代碼當時只有一個線程進入,所以我不知道「鎖定(client2)」是否會導致該類中的任何內容都不能更改,直到此鎖定爲止釋放。
如果您確實需要性能,任何形式的CPU輔助同步都會干擾它 - 完全停止。聯鎖指令比普通鎖更好 - 但僅限於短期。 (鎖定一個總線來改變一個4字節的值不是很好= D)。 – 2009-12-22 13:39:56