问题标签 [synchronized]

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 投票
6 回答
4567 浏览

java - 你如何确保多个线程可以安全地访问一个类字段?

当多个线程通过getter方法访问一个类字段时,如何维护线程安全?同步关键字是否足够?

这安全吗:

还是二传手会引入更多的复杂性?

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 投票
2 回答
1696 浏览

java - Java Web 应用程序同步问题

假设我的网络应用程序中有一个名为“Foo”类的类。它有一个 initialise() 方法,当使用 Spring 创建 bean 时会调用该方法。然后,initialise() 方法尝试加载外部服务并将其分配给一个字段。如果无法联系到服务,则该字段将设置为空。

当有人在类“Foo”上调用 get() 方法时,如果它是在 initialise() 方法中启动的,则将调用该服务。如果服务的字段为空,我想尝试加载外部服务。

如果我做这样的事情,我可能会遇到同步问题吗?

0 投票
11 回答
10402 浏览

java - 同步死锁(字符串实习生())

我用户 sun jdk 1.5 ThreadPoolExecutor(24, 24,60,TimeUnit.SECONDS, new LinkedBlockingQueue())。soemtime 我使用 jdb 工具查找线程池中所有线程的状态是“在监视器中等待”,代码是:

“同步(key.intern())”有问题吗?


我使用 jdb 工具得到以下信息,24 个线程的状态是“在监视器中等待”,这意味着 24 个线程在“key.intern()”处死锁。

(java.lang.Thread)0x28 pool-3-thread-2 在监视器中等待

(java.lang.Thread)0x27 pool-3-thread-3 在监视器中等待

(java.lang.Thread)0x1b pool-3-thread-4 在监视器中等待

(java.lang.Thread)0x1a pool-3-thread-5 在监视器中等待

(java.lang.Thread)0x19 pool-3-thread-6 在监视器中等待

(java.lang.Thread)0x18 pool-3-thread-7 在监视器中等待

(java.lang.Thread)0x17 pool-3-thread-8 在监视器中等待...

所以结果是:在多线程环境下,Sting intern() 方法可能会死锁,好吗?

0 投票
11 回答
47246 浏览

java - 在 Java 关键部分中,我应该同步什么?

在 Java 中,在代码中声明临界区的惯用方式如下:

几乎所有块都在 上同步 this,但这有什么特别的原因吗?还有其他可能性吗?关于要同步的对象是否有任何最佳实践?(例如Object? 的私有实例)

0 投票
8 回答
100150 浏览

java - Java同步静态方法:锁定对象或类

Java 文档说:

同一对象上的同步方法的两次调用不可能交错。

这对静态方法意味着什么?由于静态方法没有关联对象,同步关键字会锁定类而不是对象吗?

0 投票
23 回答
148826 浏览

java - 在 Java 中避免同步(this)?

每当 SO 上出现关于 Java 同步的问题时,有些人非常急切地指出synchronized(this)应该避免这种情况。相反,他们声称,锁定私人参考是首选。

一些给定的原因是:

包括我在内的其他人认为,这synchronized(this)是一个经常使用的习语(也在 Java 库中),它是安全且易于理解的。不应该避免它,因为您有一个错误并且您不知道多线程程序中发生了什么。换句话说:如果它适用,那么就使用它。

我有兴趣看到一些现实世界的例子(没有 foobar 的东西),在这些例子中,避免锁定在也能完成这项工作this时更可取。synchronized(this)

因此:您是否应该始终避免synchronized(this)并用锁定私人参考来代替它?


一些进一步的信息(在给出答案时更新):

  • 我们正在谈论实例同步
  • 隐式(synchronized方法)和显式形式synchronized(this)都被考虑
  • 如果您引用 Bloch 或其他有关该主题的权威,请不要遗漏您不喜欢的部分(例如 Effective Java,关于线程安全的项目:通常是实例本身的锁,但也有例外。)
  • 如果您需要除synchronized(this)提供之外的锁定粒度,synchronized(this)则不适用,因此这不是问题
0 投票
1 回答
284 浏览

flash - Is there a way to stream a stored Flash video to multiple people in sync, but let one of them control playback (play/pause/seek/etc.)

I don't know much about deploying Flash video streaming solutions, and I want to know if the following can be accomplished in Flash.

I am creating an application where multiple people can watch a video at the same time , but one of those people controls the playback of the video for everyone. Furthermore, the controller is not always the same person, it can change if someone leaves or depending on other factors.

Please point me in the right direction.

Thanks!

0 投票
23 回答
293650 浏览

java - 使用同步方法而不是同步块有优势吗?

谁能用一个例子告诉我同步方法相对于同步块的优势?

0 投票
5 回答
43549 浏览

java - HttpSession 线程安全吗,设置/获取属性线程安全操作吗?

此外,正在设置的对象是否必须是线程安全的,以保证我们知道存储在会话中的对象的状态是什么。

另外,我在网上阅读了一些建议使用的内容:

这是一个有效的建议吗?