java - 有多少个线程可以同时调用一个对象的非同步方法?

标签 java multithreading concurrency synchronization

假设我有一个带有方法 m 的类 X。方法 m NOT 是同步的,也不需要是因为它实际上并没有改变类型 X 的对象 x 的状态。

在某些线程中,我这样调用方法:x.m()。所有这些线程都使用同一个对象 x。

这个方法(方法m)可以同时在对象x上被多少个线程调用? 该方法被(比方说)100 个线程调用这一事实可能成为我的应用程序的瓶颈吗?

谢谢。

最佳答案

其他人已经回答了您的直接问题。

我想澄清一些可能你的误解……如果是,那它就是一个危险的东西。 p>

Method m is NOT synchronized and it doesn't need to be since it doesn't really change the state of the object x of type X.

这不是充分条件。不改变状态的方法通常也需要同步。

假设您有一个带有简单 getter 和 setter 的类 Test:

public class Test {
    private int foo;

    public int getFoo() {
        return foo;
    }

    public synchronized void setFoo(int foo) {
        this.foo = foo;
    }
}

getter 是线程安全的吗?

  • 根据你的规则,是的。
  • 实际上,没有。

为什么?因为除非调用 getFoosetFoo 的线程正确同步,否则在调用 setFoo(.. .) 可能会看到 foo 的陈旧值。

这是您几乎每次都能逃脱惩罚的恶劣案例之一。但是偶尔,这两个调用的时间安排会让你陷入困境。这种错误很可能会从您的测试漏洞中溜走,并且在生产中出现时很难重现。


唯一绝对不同步地从多个线程访问对象状态的情况是状态被声明为final,并且构造函数没有发布对象。

关于java - 有多少个线程可以同时调用一个对象的非同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7092143/

相关文章:

java - 如何更改 Gradle 中的 jar 输出目录?

java - 尝试使用 scnr.next 读取用户输入的字符

multithreading - 如何在不立即运行的情况下创建线程?

java.io.StreamCorruptedException : invalid type code: 00

Java - Thread 类型的 sleep(int) 方法未定义

database-design - SQL并发测试更新问题

java - Web应用程序中的并发控制

java - 在 Hibernate 中的实体方法内使用命名查询

java - try,catch,finally的执行顺序是什么

java - Java ConcurrentLinkedQueue 的奇迹