同步代码区域的方法:Lock、Monitor、MethodImplAttribute
class Program
{
static object o = new object();
static void Main(string[] args)
{
Thread thread1 = new Thread(Test);
thread1.Start();
Thread thread2 = new Thread(Test);
thread2.Start();
Console.ReadLine();
}
//[MethodImpl(MethodImplOptions.Synchronized)]
static void Test()
{
Thread.Sleep(2000);
//使用Lock
//lock(o)
//{
// for (int i = 0; i < 20; i++)
// {
// Console.WriteLine(i);
// }
//}
//使用Monitor
Monitor.Enter(o);
for (int i = 0; i < 20; i++)
{
Console.WriteLine(i);
}
Monitor.Exit(o);
}
}
属于托管线程池的线程(即其 IsThreadPoolThread
属性为 true 的线程)是后台线程。 从非托管代码进入托管执行环境的所有线程都被标记为后台线程。 通过创建并启动新的 Thread 对象而生成的所有线程都默认为前台线程。
对某线程调用 Thread.Suspend 时,系统会注意到已经请求了线程挂起,并且会让该线程执行到一个安全点,然后才实际挂起该线程。 线程的安全点是线程执行过程中可执行垃圾回收的一个点。
为了执行垃圾回收,运行时必须挂起除正在执行回收的线程以外的所有线程。 每个线程在可以挂起之前都必须置于安全点。