首先,StreamWriter线程安全么?
答:StreamWriter 的构造以及StreamWriter.WriteLine(string)都是非线程安全的
我们封装两个写日志的方法。
底层都是由StreamWriter.writeline来实现.一个加锁,一个不加锁。将加锁的那个命名为safewritelog,另一个命名为unsafeWritelog.然后利用两个循环。不停的分别创建个线程,去写日志。测试看哪个会出现写异常。代码如下:
namespace ThreadWriteLog
{
class Program
{
private static object ob = "哟内容!!";
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Thread wrtieThread = new Thread(SafyWriteLog);
wrtieThread.Name = "线程--" + i;
string content = "这是" + wrtieThread.Name + "的内容Y";
wrtieThread.Start(content);
}
for (int i = 0; i < 10; i++)
{
Thread wrtieThread = new Thread(UnSafyWriteLog);
wrtieThread.Name = "线程¨¬--" + i;
string content = "这是" + wrtieThread.Name + "的内容Y";
wrtieThread.Start(content);
}
Console.WriteLine("结束");
Console.Read();
}
public static void SafyWriteLog(object content)
{
string path = @"C:\SafeLog.txt";
lock (ob)
{
StreamWriter sw = File.AppendText(path);
sw.WriteLine(content.ToString());
sw.Close();
}
}
public static void UnSafyWriteLog(object content)
{
string path = @"C:\UnSafeLog.txt";
StreamWriter sw = File.AppendText(path);
sw.WriteLine(content.ToString());
sw.Close();
}
}
}
运行后,第一个for循环顺利结束,文件中显示 0-9进程没有问题。
这是线程--0的内容
这是线程--1的内容
这是线程--2的内容
这是线程--5的内容
这是线程--3的内容
这是线程--4的内容
这是线程--6的内容
这是线程--7的内容
这是线程--8的内容
这是线程--9的内容
也符合线程的概念,随着系统的随机调度而运行。