当前位置: 首页 > 面试题库 >

Java多线程环境中的静态方法行为

华振
2023-03-14
问题内容

有一个简单的愚蠢问题困扰着我,并在我脑海中提出了几个论点。我想排除所有对以下问题的怀疑。

class Clstest{

    public static String testStaticMethod(String inFileStr) {

        // section 0

        // section 1

        // do something with inFileStr

        // section 2

        // section 3

        return inFileStr;

    }

}

假设有五个线程同时执行一个调用Clstest.testStaticMethod("arg-n")

线程1调用Clstest.testStaticMethod("arg-1")

当线程1位于第1节中时,线程2调用Clstest.testStaticMethod("arg-2")

那么线程1将会发生什么?会进入睡眠状态吗?

当线程1获得机会时,它将从暂停的第1节继续执行吗?

在所有五个线程之间共享一个Clstest.testStaticMethod相同的Clstest.testStaticMethod线程时,该如何处理?

是否有可能互换inFileStr多个线程发送的消息?


问题答案:

汉斯·帕桑(Hans Passant)的回答很好。但是我想我会尝试为遇到此问题并且对Java陌生的任何人进行更简单的解释。开始..

Java中的内存分为两种-
堆和栈。堆是所有对象生存的地方,而堆栈是线程进行工作的地方。每个线程都有自己的堆栈,不能访问其他堆栈。每个线程还有一个指向代码的指针,该指针指向它们当前正在运行的代码位。

当线程开始运行新方法时,它将参数和局部变量保存在该方法自己的堆栈中。其中一些值可能是指向堆上对象的指针。如果两个线程同时运行相同的方法,则它们的代码指针都指向该方法,并且它们的堆栈上有它们自己的参数和局部变量的副本。仅当堆栈中的内容指向堆上的相同对象时,它们才会互相干扰。在这种情况下,可能会发生各种各样的事情。但是正如汉斯指出的那样,字符串是不可变的(无法更改),因此,如果这是唯一“共享”的对象,那么我们是安全的。

如此多的线程可以运行相同的方法。它们可能不会同时运行-
这取决于您的计算机上有多少个内核,因为JVM将Java线程映射到OS线程(已调度到硬件线程)。因此,在不使用复杂 同步
机制的情况下,您几乎无法控制这些线程的交织方式。

请注意,睡眠是线程对自身所做的事情。



 类似资料:
  • 公共类栏实现可运行{ } 结果:当中的任何线程通过同步块获取锁(例如获取)时,和将处于阻塞状态,但同时允许其他线程、和并发执行。 公共类栏实现可运行{ 结果:只有类的任何实例的一个线程将获得锁(例如获得锁),所有其他线程()将被阻塞,直到释放锁。 公共类栏实现可运行{ synchronized块()中的静态引用是否等同于?

  • 如果我有多个线程,每个线程使用injector获取EntityManager对象,每个线程使用em对象选择其他类对象的列表。准备好在for循环中使用。 如果一个线程首先完成并调用clear(),这会影响其他线程吗?比如for循环会有异常? 谢谢你。

  • 根据我在 Java 课上的知识 非静态同步方法:锁定获取特定对象 静态同步方法:类上的锁获取 我对此有点困惑,因为我们可以通过类名或对象名调用静态方法。 请假设我的类有4个方法,所有方法都是同步的。2个方法是静态的,2个不是静态的。如果我创建了我的类“对象1”的1个对象,并且还有2个线程Thread1和Thread2 问题1:如果我将尝试访问静态同步方法,使用对象1(或类名),这是否意味着“对象1

  • 问题内容: 类的静态成员是否在每个进程或线程中仅作为单个实例存在?意思是每个线程都具有自己的类的静态成员变量副本吗? 我的猜测是每个过程,对吗? 问题答案: 静态 字段 为每个类加载器提供一个值。 如果需要每个线程的值,请设置static 。

  • 我了解Class对象上的静态同步锁,以及Object实例上的非静态锁。 但是,在此问题的可接受答案中:同步块中的静态与非静态锁定对象 使用非静态锁定对象时: 线程1调用o1.foo() 线程2调用o1.foo(),将不得不等待线程1完成 线程3调用o2.foo(),它可以只继续,不介意线程1和2 为什么线程 3 可以继续而不考虑线程 1 和 2。线程 3 是否必须等待从线程 1 或 2 获取对象实

  • 问题内容: java为什么无法从静态环境引用非静态? 问题答案: 要了解原因,你必须了解两者之间的区别。 实例(非静态)方法适用于特定类型(类)的对象。这些是使用新的创建的,如下所示: 要调用实例方法,请在实例(myObject)上调用它: 但是,只能直接在类型上调用静态方法/字段,如下所示: 前一条语句不正确。也可以使用诸如此类的对象引用来引用静态字段, myObject.staticMetho