1
A
回答
4
// Assuming this uses calls from multiple threads, I used volatile.
volatile bool executed = false;
object lockExcecuted = new object();
void DoSomething()
{
lock (lockExecuted)
{
if (executed) return;
executed = true;
}
// do something
}
0
锁是首选的方法;除非你有更详细的要求。
编辑:增加“仅一次”意味着锁定不足。
0
使用lock
只允许一个线程访问关键部分,并在完成时设置一个标志表示完成。
1
public static bool hasExecuted = false;
static readonly object lockObject = new object();
static void Method()
{
lock(lockObject)
{
if(!hasExecuted)
{
// run code
hasExecuted = true;
}
}
}
0
取决于你的情况。如果此部分返回一个值,u可以使用.NET 4.0的新功能 - Lazy(T)
当然,你总是可以只设置乌尔临界段内的标志,并在执行前检查它的值(有时是在使用单例模式时完成)
相关问题
- 1. 使用thread.sleep在锁定部分C#
- 2. 锁被跳过
- 3. 使用Google Closure编译器部分跳过部分
- 4. 跳过屏幕锁
- 5. preg_match_all跳过节点部分
- 6. 跳过锁定,除非所有行都被锁定
- 7. 锁定双链接跳过列表
- 8. Postgres“跳过锁定”与Spring JDBC
- 9. 在MEX编译跳过代码部分
- 10. Python Scrapy/Selenium正在跳过我的迭代大部分
- 11. 锁(objectReference){}没有锁定关键部分
- 12. 跳过部分或全部git钩子
- 13. 分解阵列正在跳过值
- 14. BroadcastReceiver的部分锁定?
- 15. Python锁定关键部分
- 16. scanf正在跳过
- 17. 在mysql更新中跳过锁定行以避免锁定超时
- 18. 在特定页面上跳过部分执行
- 19. 正则表达式匹配空白,但跳过部分
- 20. 如何在锁定语句中实现互斥?但是如果锁定被锁定,该块会被跳过?
- 21. 使用JAXB部分解组XML以跳过某些xmlElement
- 22. 如何跳过使用BufferedReader的行的其余部分
- 23. 使用ElasticSearch索引网页时跳过常见/重复部分
- 24. 使用gradle构建Java时跳过部分源代码树
- 25. 如何使用bash中的选项跳过部分代码
- 26. django with dotcloud:部分网址跳过
- 27. boost :: async_write跳过部分字符串
- 28. 两部分PHP表单跳过检测
- 29. Grok跳过一部分邮件行
- 30. 发布模式跳过代码部分
如果执行过程只存在于锁定块中,那么执行时不需要volatile。在锁块的开始和结尾有一个内存屏障,使其他线程可以看到任何读/写操作。 –
Interlocked.Exchange奇怪地不支持'bool'。 –
是的,你必须使用int而不是bool来实现Interlocked.Exchange。 –