日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

c# lock (obj) 与 lock (this) 区别

發(fā)布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# lock (obj) 与 lock (this) 区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

lock(obj) 鎖定 obj 對象

lock(this) 鎖定 當(dāng)前實例對象,如果有多個類實例的話,lock鎖定的只是當(dāng)前類實例,對其它類實例無影響。

直接上代碼。

主窗體代碼如下:

delegate void SetTextCallback(string text);
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 利用委托設(shè)置 文本框內(nèi)容
/// </summary>
/// <param name="text"></param>
public void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = this.textBox1.Text + "\r\n" + text;
}
}

private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "";
Thread[] thd = new Thread[500];
int intI = 0;
for (intI = 0; intI < 50; intI++)
{
thd[intI] = new Thread(new ParameterizedThreadStart(thdText));
thd[intI].Name = " Thread" + intI.ToString();
thd[intI].IsBackground = true;
thd[intI].Start(intI);
}
}
/// <summary>
/// 線程調(diào)用的方法
/// </summary>
/// <param name="obj"></param>
private void thdText(object obj)
{
oper op = new oper();
int intI = Convert.ToInt32(obj);
SetText(op.addition());
}

1、lock(obj)

添加oper類,代碼如下:

    public class oper
{
private static object obj = new object();

private static Single slgTotal;

public string addition()
{
lock (obj)
{
int intI = 0;
slgTotal = 0;
for (intI = 0; intI <= 50; intI++)
{
slgTotal = slgTotal + intI;
Thread.Sleep(5);
}

return slgTotal.ToString() + " thread:" + Thread.CurrentThread.Name;
}
}
}

執(zhí)行結(jié)果如下:

大家看到每個線程執(zhí)行的結(jié)果都是相同的。下面來看lock(this)

2、lock(this)

將oper類代碼修改為如下:

    public class oper
{
private static object obj = new object();

private static Single slgTotal;

public string addition()
{
lock (this)
{
int intI = 0;
slgTotal = 0;
for (intI = 0; intI <= 50; intI++)
{
slgTotal = slgTotal + intI;
Thread.Sleep(5);
}

return slgTotal.ToString() + " thread:" + Thread.CurrentThread.Name;
}
}
}

執(zhí)行結(jié)果如下:

大家看到每個線程執(zhí)行的結(jié)果都是不同的。

分析:lock(this) 鎖定的對象 是當(dāng)前類實例,而每個線程操作的都是oper的新實例,lock(this)只對當(dāng)前實例起作用,而 slgTotal 是類的靜態(tài)變量,lock(this)實際上是沒在起起我們想要的結(jié)果。下面再看一種lock(obj)的實例

3、lock(obj) 這個第一個obj的demo稍有不同,即把oper類的obj靜態(tài)變量修改為變量,oper類修改為如下:

    public class oper
{
private object obj = new object();

private static Single slgTotal;

public string addition()
{
lock (obj)
{
int intI = 0;
slgTotal = 0;
for (intI = 0; intI <= 50; intI++)
{
slgTotal = slgTotal + intI;
Thread.Sleep(5);
}

return slgTotal.ToString() + " thread:" + Thread.CurrentThread.Name;
}
}
}

執(zhí)行結(jié)果如下:

此次運行結(jié)果和lock(this)結(jié)果是一樣的。這是為什么呢?

總結(jié):其實大家不要去看lock中鎖定的是this,還是obj,大家只要關(guān)心多線程鎖定的對象是不是為同一個對象。如果是同一個對象則會得到如上邊的demo1結(jié)果,否則則如demo2和demo3中的結(jié)果,也是我們不想要的。



轉(zhuǎn)載于:https://www.cnblogs.com/yuqilin/archive/2011/10/15/2213766.html

總結(jié)

以上是生活随笔為你收集整理的c# lock (obj) 与 lock (this) 区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。