volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。多线程的程序,共同访问的内存当中,多个线程都可以操纵,从而无法判定何时这个变量会发生变化
可以这样简单理解:线程是并行的,但对volatile的访问是顺序排除的,避免出现脏值
using System;
using System.Threading;
namespace demoVolatile
{
class Program
{
//多个线程访问的变量,标记为Volatile
//在这里如果不标记可能会卖出不止10张票
volatile static int TicketCount = 10;
static void SellTicket()
{
while (TicketCount > 0)
{
TicketCount--;
Console.WriteLine("{0} 卖出了一张票", Thread.CurrentThread.Name);
}
Console.WriteLine("{0} 下班了", Thread.CurrentThread.Name);
}
static void Main(string[] args)
{
Thread[] ck = new Thread[3];
for (int i = 0; i < 3; i++)
{
ck[i] = new Thread(SellTicket);
ck[i].Name = $"窗口{i + 1}";
}
foreach (Thread c in ck) { c.Start(); }
Console.ReadKey();
}
}
}