【发布时间】:2025-12-29 06:40:10
【问题描述】:
只是想检查以确保我理解这一点。同步方法不会创建线程,对吗?它只是确保没有其他线程在调用此方法,而同一进程中的一个线程(即 JVM)正在使用它,对吧?
【问题讨论】:
-
同步线程就像卫生间的隔间——请一次一个人。
标签: java multithreading synchronized
只是想检查以确保我理解这一点。同步方法不会创建线程,对吗?它只是确保没有其他线程在调用此方法,而同一进程中的一个线程(即 JVM)正在使用它,对吧?
【问题讨论】:
标签: java multithreading synchronized
同步方法不会创建线程,对吧?
没错。
它只确保没有其他线程在调用此方法 同一进程(即 JVM)中的一个线程正在使用它,对吧?
没错。
如需了解更多信息,请阅读Synchronized Methods。我也推荐阅读Java Concurrency in Practice。
【讨论】:
synchronized 关键字允许线程进入所谓的Monitor,这很像信号量。我不记得在学校有什么区别,除了信号量在 C 中使用,而监视器需要 C++ 和 Java 等面向对象的语言。
synchronized 关键字确实让我想起了 Mutex 锁,而不是 Semaphore,因为似乎只有一个线程可以一次进入“关键区域”,而其他线程必须等待它。 Java中不能指定允许进入监视器的线程数?
这基本上是正确的。调用同步方法不会产生新线程。它只是让其他线程在尝试为该对象的该实例调用 any 其他同步方法时阻塞。
要记住的关键是一个类的所有同步方法都使用相同的锁。
【讨论】:
是的。
同步块还有另一个重要作用:当一个线程进入一个同步块时,它会看到访问该块(或与相同锁同步的另一个块)的前一个线程对值所做的更改。
基本上在多核 cpu 上,每个线程在其核心上作为自己的内存缓存:每个核心都有相同变量的副本,它们的值在每个核心上可能不同。 当存在同步操作时,JVM 确保将变量值从一个内存缓存复制到另一个。进入同步块的线程然后会看到前一个线程“更新”的值。
正如 mre 所建议的,如果您真的想了解多线程和学习最佳实践,Java Concurrency in Practice 是一个很好的参考。
【讨论】: