C# lock(this)后面的作用域{}可有可无吗?代码如下

private void Count()
{
lock (this)
// {
for (int i = 0; i < 10000; i++)
{
int num = int.Parse(tBox1.Text.Trim());
num++;
tBox1.Text = num.ToString();
}
// }
}

c#
0

5个回答

https://msdn.microsoft.com/zh-cn/library/c5kehkcz(VS.80).aspx

通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则

不要写 lock(this)
而应该定义一个object

 object lockobj = new object();
lock (lockobj)
{
...
}
0
caozhy
weixin_45841714 回复little_how: http://www.cnblogs.com/dubing/p/3816615.html
2 年多之前 回复
w172087242
little_how 我不太了解c#,lock是锁吧,是为了防止并发吗?如果是,那么this就没有问题啊,因为并发发生在共享的变量啊,那个this指向的是共享变量,那么锁也是同一把,是可以事先的,只是用new object的话是界定更清晰。
2 年多之前 回复

我把注释的{}去掉运行结果没区别

0

没有{}只管下面一行,因为你lock包裹的只有for循环,for循环后面没有别的语句,所以就你的程序而言,没有区别。

但是 lock(this) 本身是错的

0

程序有问题,不是括号的问题

0

另外,如果count()是在非UI线程运行
tBox1.Text = num.ToString();
应该放在委托:
this.Invoke(() => { tBox1.Text = num.ToString(); });
并且这段代码不要放在lock里

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# lock(this)后面的作用域可有可无吗?代码如下
private void Count()rn rn lock (this)rn // rn for (int i = 0; i < 10000; i++)rn rn int num = int.Parse(tBox1.Text.Trim());rn num++;rn tBox1.Text = num.ToString();rn rn // rn
C# lock用法实例
源地址:http://hi.baidu.com/jiang_yy_jiang/item/55cc8a105414d38988a956a4
C#原子操作 Lock用法
C# 理解lock 一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待。但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源在同一时刻只能被一个线程操作,以确保每个操作都是有效即时的,也即保证其操作的原子性。lock是C#中最常用的同步方
c# 同步进程锁 lock千万别乱用
代码出现dug,定义了一个类型a,有int,string,datetime。List&amp;lt;a&amp;gt; p=new list&amp;lt;a&amp;gt;();p.add的条件是list里面没有a.string ,有则int加1。if(p.contains(a))    p.add(a)else    ...因为我使用的是多线程 list在满足条件下进行add,会在两分钟后被remove掉,所以 我使用了进程...
C#中对象的lock锁定
写C#代码时,遇到有过程需要排队执行,就使用了lock方法进行锁定,锁定对象为一List&amp;lt;T&amp;gt;数组,在临界区代码段中对该数据进行读取操作。在某些偶然情况下,会发现该数据在锁定代码段以外进行访问时,会抛出一个异常:“源数组长度不足。请检查 srcIndex 和长度以及数组的下限”,此时再执行其他操作就无效了。后查阅资料发现,lock锁定代码中对该数据的操作尚未执行完毕,别处就已在使用该数...
C#Lock机制
  定义:lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。 Monitor 方法是静态的,不需要生成Monitor 类的实例就可以直接调用它们。在.NET Framework 中,每个对象都有一个与之关联的锁,对象可以得到并释放它以便于在任意时间只有一个线程可以访问对象实例变量和方法。 Lock...
session作用域
已知在session中保存了一个标识符为myuser的用户对象,用户名为"李白",看看javaee有多少种方法获取该用户名: 用户名: 用户名: 用户名:${sessionScope.myuser.username} 用户名: 用户名: 用户名: 用户名: 用户名:$("body").append("${sessionScope.myuser.username}") javaee让我说你什么
C#使用lock产生死锁的一个例子
在msdn上看到lock在使用的时候,如果把public的引用对象作为lock的参数,则会增加产生死锁的可能,因为无法控制外面的lock的使用。下面是一个导致死锁的例子,帮助理解死锁和lock的使用。 class Program     {         public static object lock_A = new object();         public static o
为什么await()后会执行lock.unlock,await()时不就释放锁了吗
为什么await()后会执行lock.unlock,await()时不就释放锁了吗 举例: Java Lock类 await()和signal() 我知道你在疑惑什么   (2013-10-19 20:50:38) 转载▼
Java中并发编程中的锁机制(synchronizd和Lock)
1.三个概念 1.1.原子性 原子性是指几个操作要么全部执行,要么全部不执行。比如在支付问题中,往A给B转1000元,那么A账户减去1000和B账户加上1000就是一个原子操作,如果A减去1000成功了,但是B加上1000失败了,那么应当回滚。 1.2.可见性 可见性是指当前线程A对于共享变量所做的更改对于线程B是可见的。 1.3.有序性 在正常的单线程中,对于下面一段代码...
C#中的lock关键字
在实现Unity中的单例模式时看到的,讲解Lock的用法,作者写的明白,转过来自己收藏一下。 原文连接 : http://kb.cnblogs.com/page/88513/           摘要:lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。   前几天与同事激烈讨论了一下,有一点收获,记录起来
C#Lock关键字的使用
前言       这shu'yu
【多线程环境下,变量作用域】
如下程序,说明多线程运行时,局部变量和全局变量在两个线程中的作用域 //cat pthread.c #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;pthread.h&amp;gt; int num = 1; void *fun(void *arg) { int i=1; pthread_t pthid = pthread_self(); while(1) {...
lock为什么只能锁定引用不能锁定值类型
他要的就是引用类型,如果你传一个值类型,会装箱,下次代码运行到这里,又会装箱,两次不是同一个对象,所以锁不住lock(x){   ...}实际是通过Monitor对象完成的锁:上面等同于:System.Object obj = (System.Object)x;System.T
C#多线程Lock锁定的使用例子(多线程线程同步)
这个例子是一个模拟多个人在多台提款机上同时提取一个账户的款的情况。 在存取的过程中 可能 A线程取了100   而B线程那边还看见账户上没少掉那100快,所以导致数据不统一,赋值出现问题。 下面代码则可以测试出加上Lock锁定 与 不加的区别。   先上两个图。 第一个(加了Lock的程序):   加了的 数据每一条都是完整无错的,因为他们执行Lo
C#变量作用域问题
首先看一段代码:string text; for(int i = 0; i<5 ;i++) { text = "Line" + i.ToString(); Console.WriteLine(text); } Console.WriteLine(text);上述代码是一段再简单不过的代码了,咋一看,没有什么好分析的。 但是,越看越想,水越多,越深。 这段代码在最后一句会出
一个由于锁的作用域导致core dump的问题的解决
请看如下代码: void CCommParams::setParams( const char * authUser, const char * authPsw, const char * securityLevel, const char * p
C#之lock关键字 lock锁定语句
lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。下面的示例包含一个 lock 语句。 class Account { decimal balance; private Object thisLock = new Object(); public void
C#编程.面向对象编程.可删除对象(Using{})
Using关键字可以在代码块中初始化使用重要资源的对象,Dispose()方法会在这个代码块的末尾自动调用,用法如下: = new () ... using() {     ... } 或者把初始化化对象作为using语句的一部分; using( = new ()) {     ... } 在这两种情况下,变量可以在using代码块中使用,并在代码块的末尾自动删除
for 循环作用域问题
For 循环作用域问题for 循环简介 for 是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行代码的能力,for 语句对常用的循环模式做了一些简化,大部分的循环都具有特定的计数器变量,循环开始之前要初始化这个变量,然后每次循环都要检测一下他的值,最后计数器变量做自增操作,在这一类循环中,计数器的三个关键操作是初始化、检测和更新。for 语句就将这三步操作明确声明为循环语
C# 变量的作用域
变量的作用域是可以访问该变量的代码区域
C#学习之关于lock
lock 首先先上官方Msdn的说法 lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。 lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit。 ThreadInterruptedException 引发,如果 Interrupt 中断等
C# 在两个不同的方法里面Lock同一个锁对象,是否需要线程等待?
前述: C#中支持多线程,而多线程引发的一个比较突出的问题就是在同一个时间里,可能会有多个线程访问同一个资源,引起资源的竞争 导致数据损坏。 lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。 很多时候,我们在使用Lock关键字,其锁住的不是多个线程里真正要竞争的资源,而是通过创建一个与竞争资源“随行”的锁对象,对它
C# 关于线程锁lock的使用方法
在多线程编程中,可能会有许多线程并发的执行一段代码(代码块A),以提高执行效率。在某些情况下,我们希望A中的代码块(B)同步的执行,即同一时刻只有一个线程执行代码块B,这就需要用到锁(lock)。lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。 其写法
Lock锁,一次唤醒所有线程低性能的问题
关于Lock锁,我们简单说一下Lock锁的包是java.util.concurrent.locks.*;/* jdk1.5多线程的实现方式: jdk1.5之前对锁的操作是隐式的 synchronized(对象)//获取锁 {}//释放锁jdk1.5对锁的操作是显式的: 有一个描述锁的Lock接口,也就是把锁面向对象了 使用Lock接口的子类ReentrantLock创建一把锁使用Lock替代同步代码
bind()方法复制函数或者方法,理解this不同作用域下的指代问题
要点: 1.用法:函数名(方法名).call(对象,参数1,参数2),来复制函数或者方法的名字。 2.这个例子中,参数随机数,只在构造函数实例化的时候,创建rm实例对象时调用一次,定时器中调用的是函数的显示方法。 3.理解bind方法前后this指代不同的原因,看注释。 代码: &amp;lt;!DOCTYPE html&amp;gt; &amp;lt;html lang=&quot;en&quot;&amp;gt; &amp;lt;head&amp;...
C#多线程,静态锁static lock和非静态锁lock的区别及附跨线程访问UI的代码
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象。由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧。   其实多线程的同步,使用同步锁的方法用了好多次,今天无意中看到MSDN中,建议用: 1 private static readonly object locker1 = new object(); 2
关于for循环中,定义的i的作用域的问题。
for(var i=0;i&amp;lt;2;i++){ console.log(i) } console.log(i) 经过测试:在IE9+,谷歌,火狐中。都出现了0,1,2三个值。 所以其作用域在整个上下文中。
如何使用lock_guard
lock_gurad 是c++11 提供的一个新类,是一个区域锁, 只在作用域内起作用, 出了作用域就自动解锁。看起来应该是比较简单的,但是异常配合起来使用就需要多加注意。下面的代码是cplusplus.com 提供的sample。这个sample的本意是启动10个线程,每个线程对1个数字判断奇偶, 如果是偶数就打印 “x is even”(x 是要判断的数字),如果是奇数就打印[exceptio...
C++并发实战9:unique_lock
1 回顾采用RAII手法管理mutex的std::lock_guard其功能是在对象构造时将mutex加锁,析构时对mutex解锁,这样一个栈对象保证了在异常情形下mutex可以在lock_guard对象析构被解锁。 explicit lock_guard (mutex_type& m);//必须要传递一个mutex作为构造参数 lock_guard (mutex_type& m, adopt_
C# Lock 关键字锁定静态变量和非静态变量的区别
private static readonly object Locker1 = new object(); private readonly object Locker2 = new object(); 单实例非静态锁,线程没有并发(加锁成功); 单实例静态所,线程没有并发(加锁成功); 多实例非静态所,线程并发(加锁失败); 多实例静态所,线程没有并发(加锁成功)
重拾C#日常积累:lock给关键操作加锁
lock基础介绍lock 关键字将语句块标记为关键部分,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。 以下示例包含一个 lock 语句。比如银行账户的金额变动这些,都需要通过加锁进行保护。下面是一个取钱的操作:class Account { decimal balance; private Object thisLock = new Object(); ...
C#方法中的参数的:作用域、数据传递以及调用方法时的参数格式
* d = (c*c);尽管可空类型的变量d赋值之后具有double类型的值但是该变量仍然是可空类型的double类型变量,            而可空类型的double类型变量与double类型变量始终是两种不同的变量,所以不能在返回值为double类型的方法中              返回可空类型的double类型变量  * Program.a = 42;类类型的变量(即类中的字段)不能像...
关于session对象的作用域
这个晚点再说
if、while中变量的作用域问题
我们知道,函数、类会改变当前变量的作用域。if,while等分支循环结构会继承外部作用域,即外部变量对分支循环结构内部可见。 但是C/C++不支持if,while等分支循环结构内部作用域对外可见。
C++ C# 中作用域限定符
在不同作用域内声明的变量可以同名,但如果局部变量和全局变量同名,在局部变量作用域内如何访问全局变量?C语言没有提供同名情况下访问全局变量的方法。 1.在C++中,可以通过使用作用域限定符(::)(scope resolution operator)来区别同名的全局变量     例2-27 在局部变量作用域内利用作用域限定符访问同名的全局变量   Cpp代码    #i
c# 结构中的变量作用域
变量的作用域不能局限于函数,变量的作用域包含定义他们的代码块和直接嵌套在其中的代码块。 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace local_and_global { class Program {
lambda表达式:变量作用域
写给大忙人看的JavaSE8中的lambda表达式:变量作用域
C#多线程:深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)
本篇继续介绍WaitHandler类及其子类 Mutex,ManualResetEvent,AutoResetEvent的用法。.NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢?其实,我们抛开.NET环境看线程同步,无非是执行两种操作:一是互斥/加锁,目的是保证临界区代码操作的“原子性”;另一种是信号灯操作,目的是保证多个线程按照一定顺序执行,如生产者线程要先于消费者线程执行。.N...
C#多线程中通过lock实现线程同步
Lock定义 lock关键字用来确保代码块运行完成,而不会被其他线程中断。它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻只允许一个线程进入执行,而其他线程必须等待。这是通过在代码运行期间为给定对象获取互斥锁来实现的。在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这样可能导致几个线程同时执行一个函数,导致数据混乱,产生不可
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 深度学习ufldl教程教程如下 学习nlp后赚钱吗