日期:2014-05-18  浏览次数:20884 次

多个线程同时对一个变量进行++操作是不是安全的?(不-)
int i=0;

多线程....
i++;
多线程end

=========

请问多个线程同时对i进行++操作是不是正确的呢?(只+不减)

------解决方案--------------------
不安全。
加上lock
------解决方案--------------------
ding
------解决方案--------------------
是可以,这是多个线程同时对一个资源(这里是 一个int值)进行的访问

通常由多线程的 CPU 时间片断分配的 抢占性,无序性 而导致 被访问资源 的值不可控制,但这并不是说

这样做不可以,其实这样做是可以的.
------解决方案--------------------
可以,只是其值是难以预料的。
------解决方案--------------------
为什么不可以,如果连这个都不可以。那多线程有什么用?
------解决方案--------------------
看你想做什么了,好像不是简单的安全问题。
------解决方案--------------------
就是在某一时刻的值是无法得知而已,其他应该没什么问题
------解决方案--------------------
是不安全,但可以这样用,关键看你用在哪里了
------解决方案--------------------
如果是在所有线程运行结束后查询I的话是可以的
------解决方案--------------------
总值不论是否采取同步,都是不会变的,但是实际应用中常常不只求总值,还有对全局变量的判断和使用,比如第一个线程当i++循环两次时,输出i=2。虽然第一个线程代码中确实循环两次,i从0加到2;但在没有同步的情况下另一线程也在对i加1,所以原本输出i=2的地方可能输出i=3,4....从而造成不一致性。
以下是加lock代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Threading;
using System.Runtime.CompilerServices;
using System.Data;


public class LockMe

}
public class pp
{
private int i = 0;
private LockMe l=new LockMe();
public void plus1()
{
lock(this.l) 
{
for (int j = 0; j < 3; j++)
i++;
}
}
public void plus2()
{
lock (this.l)
{
for (int j = 0; j < 3; j++)
i++;
}

}


}
public class PP
{
static void Main()
{
pp p = new pp();
ThreadStart t1 = new ThreadStart(p.plus1);
ThreadStart t2 = new ThreadStart(p.plus2);
Thread T1 = new Thread(t1);
Thread T2 = new Thread(t2);
T1.Start();
T2.Start();
Console.WriteLine(p.i);
}
}