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