问题标签 [synchronization]

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 投票
4 回答
922 浏览

svn - 将 SourceSafe 与 SVN 同步

我们公司有一项政策,要求将源代码保存在 SourceSafe 存储库中。我努力说服管理层迁移到 SVN,但没有成功(无论如何,这是另一个问题)。

由于我和我的几个同事使用放置在我计算机上的 SVN 存储库(通过 Apache),我制作了一个 PowerShell 脚本,它将存储库备份到公司服务器上(然后也会定期备份)。这很好用,但假设我还想在我们的 SourceSafe 服务器上保留一份源代码的副本。

有什么经验或技巧吗?

谢谢

0 投票
7 回答
8954 浏览

c# - 在 C# 中锁定

我仍然有点不清楚什么时候在一些代码周围加锁。我的一般经验法则是在读取或写入静态变量时将操作包装在锁中。但是当一个静态变量只被读取时(例如,它是在类型初始化期间设置的只读),访问它不需要包含在锁定语句中,对吗?我最近看到一些类似于以下示例的代码,这让我觉得我的多线程知识可能存在一些差距:

这对我来说没有意义——为什么会出现读取寄存器的并发问题?

此外,这个例子提出了另一个问题。其中一个比另一个更好吗?(例如,两个持有锁的时间更短?)我想我可以拆卸 MSIL ......

对比

0 投票
4 回答
13487 浏览

.net - 为什么 .NET 中没有通用同步队列?

我注意到您可以调用 Queue.Synchronize 来获取线程安全的队列对象,但同样的方法在 Queue<T> 上不可用。有谁知道为什么?似乎有点奇怪。

0 投票
2 回答
962 浏览

synchronization - 如果没有特殊的硬件指令,一个代码将如何测试和设置行为?

我发现的大多数实现都需要硬件指令来执行此操作。但是我强烈怀疑这是必需的(如果是,我不知道为什么......)

0 投票
10 回答
31550 浏览

c++ - C++ 线程,共享数据

我有一个正在运行 2 个线程的应用程序... 是否可以确定当我从一个线程更改全局变量时,另一个线程会注意到此更改?我没有任何同步或互斥系统......但这段代码是否应该一直工作(想象一个名为dataUpdated的全局布尔值):

线程 1:

线程 2:

像 gcc 这样的编译器是否会以不检查全局值的方式优化此代码,只在编译时考虑它的值(因为它永远不会同时更改)?

PS:对于类似游戏的应用程序来说,在写入值时是否会读取并不重要......重要的是其他线程会注意到更改。

0 投票
7 回答
33509 浏览

synchronization - 测试和设置是做什么用的?

在阅读了 Test-and-Set Wikipedia entry之后,我仍然有一个问题“Test-and-Set 将用于什么?”

我意识到您可以使用它来实现 Mutex(如维基百科中所述),但它还有什么其他用途?

0 投票
4 回答
5982 浏览

c# - C# / ASP.NET - Web 应用程序锁定

我正在开发一个 C#/ASP.NET Web 应用程序,并且在许多情况下我需要进行锁定。理想情况下,我希望锁独立运行,因为它们彼此无关。我一直在考虑[MethodImpl(MethodImplOptions.Synchronized)]和一些使用方法lock(),但我有一些问题/疑虑。

看起来像 MethodImplOptions.Synchronized will essentially dolock(this)`。如果是这种情况,似乎一个线程进入任何同步方法都会阻止所有其他线程进入任何同步方法。那正确吗?如果是这样,这还不够细化。在这一点上,我似乎还不如使用 Application.Lock。(但如果我错了,请纠正我。)

关于lock(),我试图弄清楚我应该传入什么。我是否应该专门为此目的创建一组对象,并将每个对象用于不同的锁?有没有更好的办法?

提前致谢!

0 投票
2 回答
1666 浏览

sql-server - MS-SQL Server 2005:使用备用快照位置初始化合并订阅

一年前我们开始了一些海外合并复制,到目前为止一切都很好。我的问题是,我们的系统中现在有如此多的数据,以至于订阅者的服务器上的任何崩溃都将是一场灾难:以标准方式重新初始化订阅将需要几天时间(我们的连接肯定很慢,但已经非常非常昂贵)!我一直在跟进的想法如下:

  1. 制作原始数据库的副本,冻结它,通过飞机将文件发送给订阅者,然后在没有快照的情况下启动复制:这是传统上使用旧版本 SQL 完成的事情,但对我来说听起来有点混乱:我将不得不将我的发布者的数据置于只读模式并停止所有复制,直到操作完成。
  2. 制作数据快照,将快照文件发送到国外,将它们安装在订阅服务器上,并在复制属性中将新快照位置指示为备用位置。这对我来说听起来很公平(没有必要暂停正在进行的复制,没有数据冻结),但是,在这一点上,微软的帮助没有......帮助。

我相信你们中的一些人已经经历过这样的情况。你的选择是什么?

编辑:当然,有人可以说“你为什么不尝试一下你的想法”,但这需要几个小时(sql-servers、虚拟机和所有这些东西的多个实例......),而我以为做这件事的人只需要 2 分钟就可以解释他的想法。如果有人愿意腾出 2 分钟的时间来为我节省数小时的辛勤工作,我将是最幸福的人……

0 投票
20 回答
54178 浏览

java - 在 Java 中同步 String 对象

我有一个 web 应用程序,我正在对它进行一些负载/性能测试,特别是在我们预计数百名用户访问同一页面并在此页面上大约每 10 秒刷新一次的功能上。我们发现我们可以使用此功能进行的一个改进领域是将来自 Web 服务的响应缓存一段时间,因为数据没有变化。

在实现了这个基本缓存之后,在进一步的测试中我发现我没有考虑并发线程如何同时访问缓存。我发现在大约 100 毫秒的时间内,大约 50 个线程试图从缓存中获取对象,发现它已经过期,访问 Web 服务以获取数据,然后将对象放回缓存中。

原始代码看起来像这样:

因此,为了确保在对象key过期时只有一个线程在调用 Web 服务,我认为我需要同步 Cache get/set 操作,并且似乎使用缓存键将是对象的一个​​很好的候选者同步(这样,对电子邮件 b@b.com 的此方法的调用不会被对 a@a.com 的方法调用阻止)。

我将方法更新为如下所示:

我还为“同步块之前”、“同步块内部”、“即将离开同步块”和“同步块之后”等内容添加了日志记录行,这样我就可以确定我是否有效地同步了 get/set 操作。

然而,这似乎没有奏效。我的测试日志的输出如下:

我希望一次只看到一个线程进入/退出围绕 get/set 操作的同步块。

在 String 对象上同步是否存在问题?我认为缓存键是一个不错的选择,因为它是操作所独有的,即使final String key在方法中声明了,我认为每个线程都会获得对同一个对象的引用,因此会对此进行同步单个对象。

我在这里做错了什么?

更新:进一步查看日志后,似乎具有相同同步逻辑的方法,其中密钥始终相同,例如

不要表现出相同的并发问题 - 一次只有一个线程进入块。

更新2:感谢大家的帮助!我接受了关于intern()ing Strings 的第一个答案,这解决了我最初的问题 - 多个线程正在进入我认为它们不应该进入的同步块,因为key' 具有相同的值。

正如其他人所指出的那样,intern()出于这样的目的并在这些字符串上同步确实是一个坏主意 - 当对 webapp 运行 JMeter 测试以模拟预期负载时,我看到使用的堆大小增长到近 1GB不到20分钟。

目前我正在使用仅同步整个方法的简单解决方案 - 但我真的很喜欢 martinprobst 和 MBCook 提供的代码示例,但是因为我getData()目前在这个类中有大约 7 个类似的方法(因为它需要大约 7 个不同的数据来自 Web 服务),我不想为每个方法添加关于获取和释放锁的几乎重复的逻辑。但这对于未来的使用绝对是非常非常有价值的信息。我认为这些最终是关于如何最好地使这种线程安全的操作的正确答案,如果可以的话,我会给这些答案更多的投票!

0 投票
1 回答
2159 浏览

svn - Team Foundation Server - 使用 API 同步到 SVN

有没有人使用 TFS 的 API 来同步不同类型的存储库?我有一个 SVN 存储库,我想与 TFS 存储库同步。更准确地说,我只想偶尔(每晚)从 SVN 获取最新的所有内容,并将其作为最新版本转储到 TFS。

有什么建议吗?