쓰레드끼리 경합이 일어나지 않고 안전하면서 ,반영구적으로 안전히 사용할 수 있는 공간이다.
using System;
using System.Reflection.Metadata.Ecma335;
using System.Threading;
using System.Threading.Tasks;
namespace SeverCore
{
internal class Program
{
static ThreadLocal<string> ThreadName = new ThreadLocal<string>(() => { return $"My Name is {Thread.CurrentThread.ManagedThreadId}"; });
static void WhoAmI()
{
bool repeat = ThreadName.IsValueCreated;
if (repeat)
{
Console.WriteLine(ThreadName.Value + "(repeat)");
}
else
{
Console.WriteLine(ThreadName.Value);
}
}
static void Main(string[] args)
{
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(3, 3);
Parallel.Invoke(WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI);
}
}
}
위의 줄에서 디버깅을 했을때 value의 값이 null이다.
하지만 아래 화면을 보면 value의 값이 갱신된 상태로 출력이 된다.
즉 값이 null인 경우
() => { return $"My Name is {Thread.CurrentThread.ManagedThreadId}"; }
이 부분이 실행됨을 확인하였다.