问题标签 [locking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
46232 浏览

sql - 在使用视图的查询中使用 WITH NOLOCK 表提示 - 它是否在视图内传播?

如果在 SQL Server 中的视图上使用“WITH NOLOCK”查询提示,它是否将该提示传播到视图定义本身,即使视图定义中的原始表不使用 NOLOCK?需要这样做的原因是,有时支持人员想要执行大量耗时的查询,但宁愿不使用应用程序本身的视图强制锁定所有查询。

0 投票
4 回答
6410 浏览

java - 静态成员需要特殊的同步块吗?

我有一个看起来像这样的类:

我可以认为对象是同步的,还是因为它是静态成员而存在问题?

编辑:请注意,不同的线程可能正在访问 doSomething() 并且在这种情况下必须以线程安全的方式访问该对象。

0 投票
3 回答
11660 浏览

java - 让一个线程进入休眠状态,直到另一个线程解决了某个条件

这是完成(我认为是)同一件事的两段代码。

我基本上是在尝试学习如何使用 Java 1.5 的并发来摆脱 Thread.sleep(long)。第一个示例使用 ReentrantLock,第二个示例使用 CountDownLatch。我想要做的主要是让一个线程进入睡眠状态,直到另一个线程解决了一个条件。

ReentrantLock 在我用来决定是否唤醒另一个线程的布尔值上提供了一个锁,然后我使用带有等待/信号的条件来休眠另一个线程。据我所知,我需要使用锁的唯一原因是如果有多个线程需要对布尔值进行写访问。

CountDownLatch 似乎提供与 ReentrantLock 相同的功能,但没有(不必要的?)锁。然而,感觉就像我通过只需要一个倒计时来初始化它来劫持它的预期用途。我认为它应该在多个线程将要处理同一个任务时使用,而不是在多个线程正在等待一个任务时使用。

所以,问题:

  1. 我是否在 ReentrantLock 代码中为“正确的事情”使用了锁?如果我只在一个线程中写入布尔值,是否需要锁?只要我在唤醒任何其他线程之前重置布尔值,我就不会引起问题,可以吗?

  2. 是否有一个类似于 CountDownLatch 的类可以用来避免更自然地适合此任务的锁(假设我应该在这种情况下避免它们)?

  3. 还有其他方法可以改进我应该注意的代码吗?

示例一:

示例二:

0 投票
6 回答
91955 浏览

windows - 释放 Windows 文件共享锁

这个问题在工作中时不时出现。我们的构建机器可以通过普通的 Windows 文件共享访问它的文件。如果有人在机器上远程浏览一个文件夹,并让窗口在一夜之间打开,那么构建就会失败(就像现在所做的那样)。资源管理器窗口在源树中的一个子文件夹中留下了打开的点。构建会删除源代码,并在构建之前进行干净的签出。删除失败。

现在,我想让构建工作。我是从家里登录的,我宁愿不重新启动构建机器。我无法找到机器正在查找的人员和文件,也无法远程重新启动他们的机器。

当windows共享有锁时,锁定过程是系统,所以我不认为我可以像普通锁一样杀死它。

有谁知道无需重新启动机器即可释放共享文件夹锁定的方法?

0 投票
5 回答
8858 浏览

linux - 使用锁定文件避免两个脚本实例同时运行时如何避免竞争条件?

避免同一脚本的两个实例同时运行的典型方法如下所示:

有没有更好的方法来锁定来自 shell 脚本的文件,避免竞争条件?必须改用目录吗?

0 投票
11 回答
41376 浏览

php - 在php中获得锁定的最佳方法

我正在尝试更新 APC 中的变量,并且将有许多进程尝试这样做。

APC 不提供锁定功能,所以我正在考虑使用其他机制……我目前发现的是mysql 的GET_LOCK() 和php 的flock()。还有什么值得考虑的吗?

更新:我找到了 sem_acquire,但它似乎是一个阻塞锁。

0 投票
4 回答
315 浏览

c# - 锁定在 .net 中的行为如何?

当 Foo 之外的东西调用 Foo 的 Object 访问器时,例如,

锁定将如何发生?运行 Update() 的线程是否必须等到上述 foreach 完成处理对象列表?我希望这两个可以同时工作,是制作对象深层副本的唯一解决方案吗?

0 投票
4 回答
1994 浏览

java - 这是损坏的双重检查锁定吗?

Checkstyle 将此代码报告为“双重检查锁定习惯用法已损坏”,但我认为我的代码实际上并未受到双重检查锁定问题的影响。

如果不存在具有该 id 的行,则该代码应该在数据库中创建一行。它在多线程环境中运行,我想避免主键存在 SQL 异常。

伪代码:

我同意它看起来像双重检查锁定,但我没有使用静态变量,并且 fetch() 和 create() 中的代码可能太复杂而无法内联和乱序。

我错了还是检查式?:)

0 投票
2 回答
1628 浏览

oracle - 网络中断导致跨数据库链接的存储过程查询永远挂起

我支持通过 WAN 查询远程数据库的一些存储过程。网络偶尔会出现故障,但最糟糕的是程序失败并且必须重新启动。

在过去的几周里,情况发生了险恶的转折。而不是失败的程序挂在一个奇怪的锁定状态。它们不能在 Oracle 内部被杀死,只要它们存在,任何运行该过程的其他副本的尝试也会挂起。我们找到的唯一解决方案是使用操作系统中的“kill -9”来终止有问题的程序。其中一些程序几个月甚至几年都没有改变,所以我怀疑数据库或数据库配置中的根本原因。

任何人都知道我们可以做些什么来解决这个问题?或者 PL/SQL 是否具有可以添加到代码中的超时机制,以便我可以创建一个可以以编程方式处理的异常?

0 投票
5 回答
8620 浏览

java - 非常不寻常的情况 - 线程被它持有的锁阻塞?

我正在处理的这个 java 程序似乎在启动时挂起,所以我尝试使用 jconsole 来调试问题。事实证明,它正在等待对声明为的方法的调用 -

但这是疯狂的部分,“同步”方法的锁已经被为它阻塞的线程持有。在执行 getThreadInfo() MXBean 方法后,我附上了 JConsole 的屏幕截图。

注意 lockOwnerId 和 threadId 是一样的!这怎么可能?

替代文字

编辑:
链接到这种情况的堆栈跟踪之一。请注意,在查看堆栈跟踪后,可能会出现甚至 'org.eclipse.jdt.internal.ui.text.JavaReconciler' 线程正在尝试锁定同一个 DiskIndex 对象,但如果您查看对象地址,您将看到它实际上是一个不同的 DiskIndex 对象。

编辑 2: 我在重现此问题时获得的
另一个指向不同堆栈跟踪的链接。将两者进行比较以了解共同点应该会有所帮助。