Добрый день,
На собеседовании задали вопрос:
есть класс:
public class SimpleCub
{
public int X
{
get;
private set;
}
public int Y
{
get;
private set;
}
public int Z
{
get;
private set;
}
public SimpleCub(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
#region Equals_GetHashCode Members
public override bool Equals(Object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;
SimpleCub simpleCube = (SimpleCub)obj;
return ((simpleCube.X == X) && (simpleCube.Y == Y) && (simpleCube.Z == Z));
}
public override int GetHashCode()
{
Func<byte[], int> calcHash = (arr) =>
{
using (RIPEMD160Managed myRIPEMD160 = new RIPEMD160Managed())
{
return BitConverter.ToInt32(myRIPEMD160.ComputeHash(arr), 0);
}
};
List<byte> listBytes = new List<byte>(BitConverter.GetBytes(X));
listBytes.AddRange(BitConverter.GetBytes(Y));
listBytes.AddRange(BitConverter.GetBytes(Z));
return calcHash(listBytes.ToArray());
}
#endregion
}
по определенным правилам создаются допустим 10 экземпляров данного типа и добавляются в List<SimpleCub> list1
эти же созданные экземпляры добавляются в List<SimpleCub> list2
создается дочерний поток thread1 и передается в него list1
создается дочерний поток thread2 и передается в него list2
в дочерних потоках создается (в 1-м):
dic1 = new Dictionary<SimpleCub, object>();
(во 2-м):
dic2 = new Dictionary<SimpleCub, object>();
и соответсвенно добавляются элементы SimpleCub (в качестве ключа) в dic1 из list1
добавляются элементы SimpleCub (в качестве ключа) в dic2 из list2
далее в каждом из дочерних потоках создаются новые SimpleCub и добавляются в dic1 или dic2 в качестве ключа.
Вопрос:
Нужна ли блокировка(синхронизация) при добавлении элементов в dic1 и dic2 ?