面试题:
请编写一段程序,已知变量(int[] i=new int[]{0}),创建两个线程,其中一个线程每隔一秒种对i[0]进行加1,另外一个线程没间隔一秒对i[0]进行减1,对i[0]进行加减时需要考虑到线程安全。
解答:
首先编写编写两个线程,每个线程一个循环对变量数组加减操作,在计算的时候需要加锁。代码如下:
代码语言:javascript复制 private static object lockObj = new object();//定义锁
private static object lockObj2 = new object();//定义锁
static int[] i = new int[] { 0 };//数组
public static void Main()
{
//开启两个线程
Thread thread = new Thread(new ThreadStart(Threadaddition));
thread.Start();
Thread thread2 = new Thread(new ThreadStart(Threadsub));
thread2.Start();
Console.WriteLine(i[0]);
}
private static void Threadaddition()
{
try
{
while (true)
{
lock(lockObj)//加锁
{
Thread.Sleep(1000);
i[0] = i[0] 1;
}
}
}
catch (Exception ee)
{
}
}
private static void Threadsub()
{
try
{
while (true)
{
lock (lockObj2)//加锁
{
Thread.Sleep(1000);
i[0] = i[0] - 1;
}
}
}
catch (Exception ee)
{
}
}
还可以用信号量实现,大家可以尝试一下。
欢迎欢迎大家评论指正,或写出自己的答案。
推荐阅读:
一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel
推荐一个基于 .NET 开发的开源工作流项目
推荐一个使用 .NET 和 Angular 开发的在线任务管理工具
基于.NET的强大文件格式开源转换工具
字符串 --- 不可变性与驻留池
Dotnet工具箱:开源、免费的纯前端工具网站,带你探索10大工具分类和73个实时在线小工具