我有一个访问myst同步的方法,只允许一个线程同时通过它。这是我目前的实施:
private Boolean m_NoNeedToProceed;
private Object m_SynchronizationObject = new Object();
public void MyMethod()
{
lock (m_SynchronizationObject)
{
if (m_NoNeedToProceed)
return;
现在我正在考虑改变它有点像这样:
private Boolean m_NoNeedToProceed;
private Object m_SynchronizationObject = new Object();
public void MyMethod()
{
if (m_NoNeedToProceed)
return;
lock (m_SynchronizationObject)
{
在锁定它之前快速返回不应该更好,以便调用线程可以继续而无需等待前一个完成方法调用吗?
答案 0 :(得分:1)
在锁定它之前快速返回不应该更好......
没有。锁定不仅仅是一种互斥机制,它还是一个内存障碍 1 。如果没有锁定,如果任何并发线程试图修改变量 2 ,则可能引入数据争用。
顺便说一句,当没有争用时,锁具有良好的性能,所以无论如何你都不会获得太多的性能。一如既往,不要对性能做出假设,尤其是“接近金属”。如果有疑问,请测量!...这样调用线程可以在不等待前一个完成方法调用的情况下继续进行?
这只是意味着您持有锁的时间超过了必要的时间。一旦共享内存不再需要保护(这可能比方法退出更快),就释放锁定,并且您不需要试图人为地绕过它。
1 I.e。触发缓存一致性机制,以便所有CPU内核都能看到“相同”的内存。
2 例如,一个线程写入变量,但是这个更改在一个内核的写缓冲区中持续了一段时间,因此其他内核上的其他线程不会立即看到它。
答案 1 :(得分:0)
是的,只要m_NoNeedToProceed
没有任何与之相关的竞争条件。
如果该方法需要很长时间才能运行,并且某些线程不需要实际访问该方法的关键部分。然后最好让他们尽早返回,而不是锁定。
答案 2 :(得分:0)