using System.Threading.Tasks;
public static void Main()
Console.WriteLine("--- started ---");
MyClass.MyClassInstance.Value.SomeFunction();
MyClass.MyClassInstance.Value.SomeFunction();
MyClass.MyClassInstance.Value.SomeFunction();
Task task1 = Task.Factory.StartNew(()=>{MyClass.MyClassInstance.Value.SetVal(1);});
Task task2 = Task.Factory.StartNew(()=>{MyClass.MyClassInstance.Value.SetVal(2);});
Task task3 = Task.Factory.StartNew(()=>{MyClass.MyClassInstance.Value.SetVal(3);});
Task task4 = Task.Factory.StartNew(()=>{MyClass.MyClassInstance.Value.SetValWithLock(1);});
Task task5 = Task.Factory.StartNew(()=>{MyClass.MyClassInstance.Value.SetValWithLock(2);});
Task task6 = Task.Factory.StartNew(()=>{MyClass.MyClassInstance.Value.SetValWithLock(3);});
public static Lazy<MyClass> MyClassInstance = new Lazy<MyClass>(()=> new MyClass());
public int val1 {get;set;}
public int val2 {get;set;}
Console.WriteLine("instance created");
public void SomeFunction(){
Console.WriteLine("inside some function");
public void SetVal(int i){
public void SetValWithLock(int i){
lock(MyClassInstance.Value)