Questions tagged «locking»

锁定使不同类型的资源一次只能由一个进程使用。

9
易失性,连锁性与锁定
假设一个类具有一个public int counter可由多个线程访问的字段。这int仅递增或递减。 要增加此字段,应使用哪种方法,为什么? lock(this.locker) this.counter++;, Interlocked.Increment(ref this.counter);, 将的访问修饰符更改counter为public volatile。 现在我已经发现volatile,我已经删除了许多lock语句和对的使用Interlocked。但是,有理由不这样做吗?

10
乐观锁定与悲观锁定
我了解乐观锁定和悲观锁定之间的区别。现在有人可以向我解释我什么时候一般使用其中一个? 并根据我是否使用存储过程执行查询而改变了这个问题的答案? 但是仅仅检查一下,乐观的意思是“阅读时不要锁住桌子”,悲观的意思是“阅读时锁住桌子”。

8
锁到底如何工作?
我看到对于使用不是线程安全的对象,我们使用如下锁将代码包装起来: private static readonly Object obj = new Object(); lock (obj) { // thread unsafe code } 因此,当多个线程访问同一代码时会发生什么(假设它在ASP.NET Web应用程序中运行)。他们排队了吗?如果是这样,他们将等待多长时间? 使用锁会对性能产生什么影响?

16
为什么锁{this}不好?
在MSDN文档说, public class SomeObject { public void SomeOperation() { lock(this) { //Access instance variables } } } 是“是否可以公开访问该实例的问题”。我想知道为什么吗?是因为锁的持有时间超过了必要?还是还有其他更阴险的原因?



7
Java中是否会发生虚假唤醒?
看到各种与锁定相关的问题,并且(几乎)总是发现“由于虚假唤醒而引起的循环”术语1我想知道,有人经历过这种唤醒(例如,假设硬件/软件环境不错)吗? 我知道“虚假”一词没有明显的原因,但是发生此类事件的原因可能是什么? (1注意:我不是在问循环练习。) 编辑:一个帮助器问题(对于那些喜欢代码示例的人): 如果我有以下程序,并且运行它: public class Spurious { public static void main(String[] args) { Lock lock = new ReentrantLock(); Condition cond = lock.newCondition(); lock.lock(); try { try { cond.await(); System.out.println("Spurious wakeup!"); } catch (InterruptedException ex) { System.out.println("Just a regular interrupt."); } } finally { lock.unlock(); } } } 我该怎么做才能await将其虚假地唤醒,而无需永远等待随机事件?

5
SELECT语句中NOLOCK提示的作用
我想真正的问题是: 如果我不在乎脏读,将带(NOLOCK)提示添加到SELECT语句中会影响以下内容的性能: 当前的SELECT语句 给定表的其他交易 例: Select * from aTable with (NOLOCK)
199 sql  sql-server  locking 

11
Java同步方法锁定对象还是方法?
如果我在同一个类中有2个同步方法,但是每个方法都访问不同的变量,那么2个线程可以同时访问这2个方法吗?锁是否发生在对象上,或者是否与同步方法中的变量一样具体? 例: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2个线程可以访问类X执行相同的实例x.addA(),并x.addB()在同一时间?

7
递归锁(Mutex)与非递归锁(Mutex)
POSIX允许互斥量是递归的。这意味着同一线程可以锁定同一互斥锁两次,并且不会死锁。当然,它还需要将其解锁两次,否则其他线程将无法获得该互斥锁。并非所有支持pthread的系统都支持递归互斥锁,但是如果要符合POSIX,则必须这样做。 其他API(更高级的API)通常也提供互斥体,通常称为“锁定”。某些系统/语言(例如Cocoa Objective-C)提供递归和非递归互斥体。有些语言也只提供其中一种。例如,Java互斥锁始终是递归的(同一线程可能在同一对象上两次“同步”两次)。根据它们提供的其他线程功能的不同,不使用递归互斥可能没有问题,因为可以很容易地自己编写(我已经在更简单的互斥/条件操作的基础上实现了递归互斥)。 我不太了解的是:非递归互斥锁有什么用处?如果两次锁定同一个互斥锁,为什么还要线程死锁?即使是可以避免这种情况的高级语言(例如,测试是否会死锁并在发生异常时抛出异常)通常也不会这样做。他们会让线程死锁。 这是否仅适用于以下情况:我不小心将其锁定两次,而仅将其解锁一次,并且在递归互斥的情况下,将很难发现问题,因此我立即使其死锁,以查看错误的锁定出现在何处?但是在解锁时返回锁计数器是否可以做同样的事情,在这种情况下,我确定我释放了最后一个锁并且计数器不为零,我可以抛出异常或记录问题吗?还是我没有看到其他任何更有用的非递归互斥用例?还是仅仅是性能,因为非递归互斥锁可能比递归互斥锁快一点?但是,我对此进行了测试,但差异实际上并没有那么大。



5
.NET Framework中并发HashSet <T>?
我有以下课程。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); } 我需要从不同的线程更改字段“数据”,所以我想对当前的线程安全实现提出一些意见。 class Test{ public HashSet&lt;string&gt; Data = new HashSet&lt;string&gt;(); public void Add(string Val){ lock(Data) Data.Add(Val); } public void Remove(string Val){ lock(Data) Data.Remove(Val); } } 有没有更好的解决方案,可以直接进入现场并保护它免受多个线程的并发访问?

5
锁定未锁定的互斥锁的效率如何?互斥锁的成本是多少?
在低级语言(C,C ++或任何其他语言)中:我可以选择是否拥有一堆互斥对象(例如pthread给我的东西或本机系统库提供的东西)或一个对象的单个对象。 锁定互斥锁的效率如何?即可能有多少个汇编程序指令,它们需要多少时间(在互斥锁未锁定的情况下)? 互斥锁的成本是多少?确实有很多互斥体是一个问题吗?还是我可以在代码中抛出与变量一样多的互斥量int变量,这并不重要吗? (我不确定不同的硬件之间有多少区别。如果有,我也想知道它们。但是大多数情况下,我对通用硬件很感兴趣。) 关键是,通过使用许多互斥量(每个互斥量仅覆盖对象的一部分)而不是整个对象的单个互斥量,我可以保护很多块。我想知道我应该走多远。即我应该尽可能真正地保护任何可能的块,无论这意味着多少复杂和多少互斥量? WebKits博客文章(2016)中有关锁定的问题与该问题非常相关,并解释了自旋锁,自适应锁,futex等之间的区别。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.