黑马程序员技术交流社区
标题:
关于线程同步的问题
[打印本页]
作者:
靳石磊
时间:
2013-4-12 22:00
标题:
关于线程同步的问题
本帖最后由 靳石磊 于 2013-4-12 22:03 编辑
两个线程执行同一个方法改变同一个值:
class ThreadUse
{
public int count = 0;
public void CountAdd()
{
for (int i = 1; i <= 100; i++)
{
Console.WriteLine(Thread.CurrentThread.Name.ToString());
this.count++;
Console.WriteLine("i=" + this.count);
}
}
}
class Program
{
static void Main(string[] args)
{
ThreadUse threaduse = new ThreadUse();
Thread thread2 = new Thread(threaduse.CountAdd);
thread2.Name = "线程2";
Thread thread3 = new Thread(threaduse.CountAdd);
thread3.Name = "线程3";
thread2.Start();
thread2.Join();
thread3.Start();
thread3.Join();
//thread2.Abort();
//thread3.Abort();
Console.WriteLine(threaduse.count);
Console.ReadKey();
}
}
执行结果:
未命名.jpg
(10.54 KB, 下载次数: 8)
下载附件
2013-4-12 22:00 上传
为什么i是从52开始的,i从1到50为什么没有输出?
C:\Users\Administrator\Desktop\未命名.jpg
作者:
曾玉锋
时间:
2013-4-12 23:38
class ThreadUse
{
public int count = 0;
public void CountAdd()
{
for (int i = 1; i <= 100; i++)
{
Console.WriteLine(count++);
}
}
}
class Program
{
static void Main(string[] args)
{
ThreadUse threaduse = new ThreadUse();
Thread thread2 = new Thread(threaduse.CountAdd);
thread2.Name = "线程2";
Thread thread3 = new Thread(threaduse.CountAdd);
thread3.Name = "线程3";
thread2.Start();
thread3.Start();
//thread2.Abort();
//thread3.Abort();
//Console.WriteLine(threaduse.count);
Console.ReadKey();
}
}
复制代码
作者:
靳石磊
时间:
2013-4-17 18:42
曾玉锋 发表于 2013-4-12 23:38
为什么有这一句 Console.WriteLine(Thread.CurrentThread.Name.ToString());
和没有这一句会有区别,原因可在?
作者:
崔宏奎
时间:
2013-4-17 21:52
本帖最后由 崔宏奎 于 2013-4-17 22:18 编辑
目测这样会出错的,某些时候会打印出i=101;
Ps:往上翻翻看看,不应该没执行
作者:
曾玉锋
时间:
2013-4-18 00:01
class ThreadUse
{
public int count = 0;
//定义一个对象用做锁
ThreadUser user=new ThreadUser();
public void CountAdd()
{
//锁住线程,只允许挨个访问,不允许多个线程同时访问
lock(user){
for (int i = 1; i <= 100; i++)
{
Console.WriteLine(count++);
}
}
}
}
class Program
{
static void Main(string[] args)
{
ThreadUse threaduse = new ThreadUse();
Thread thread2 = new Thread(threaduse.CountAdd);
thread2.Name = "线程2";
Thread thread3 = new Thread(threaduse.CountAdd);
thread3.Name = "线程3";
thread2.Start();
thread3.Start();
//thread2.Abort();
//thread3.Abort();
//Console.WriteLine(threaduse.count);
Console.ReadKey();
}
}
复制代码
其实,线程同步涉及到锁的概念。因为你们以后才会接触到,现在说到这里可能会很迷茫
多线程的执行顺序是不可预测的,多执行一行代码和少执行一行代码 结果当然不一样。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2