Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果Java类只包含静态方法和字段,那么它们在机器(JVM)级别上有实例吗?_Java_Static_Instance - Fatal编程技术网

如果Java类只包含静态方法和字段,那么它们在机器(JVM)级别上有实例吗?

如果Java类只包含静态方法和字段,那么它们在机器(JVM)级别上有实例吗?,java,static,instance,Java,Static,Instance,如果Java类只包含静态方法和字段,那么它们在机器(JVM)级别上有实例吗 如果是,在执行多线程处理时,静态方法和字段会产生什么影响?有什么经验吗?静态方法和变量在Java中是类级别的,而不是实例级别的 所有共享的、可写的状态都需要同步和线程安全,无论是静态的还是实例的。java中没有“静态类”这样的东西。有内部静态类,但我认为您的问题不是关于这种类型的类 每个类加载器而不是每个虚拟机加载一次类,这是一个重要的区别,例如像tomcat这样的应用服务器在每个部署的应用程序中有不同的类加载器,这样每

如果Java类只包含静态方法和字段,那么它们在机器(JVM)级别上有实例吗


如果是,在执行多线程处理时,静态方法和字段会产生什么影响?有什么经验吗?

静态方法和变量在Java中是类级别的,而不是实例级别的


所有共享的、可写的状态都需要同步和线程安全,无论是静态的还是实例的。

java中没有“静态类”这样的东西。有内部静态类,但我认为您的问题不是关于这种类型的类

每个类加载器而不是每个虚拟机加载一次类,这是一个重要的区别,例如像tomcat这样的应用服务器在每个部署的应用程序中有不同的类加载器,这样每个应用程序都是独立的(不是完全独立的,但总比没有好)


多线程的效果是多线程中共享数据结构的效果,在java中没有什么特别之处。本主题中有很多书,比如(以java为中心)或(解释不同并发模型,非常有趣的书)

是的,JVM中每个加载的类都有一个
java.lang.class
的实例。它们是否只包含静态方法/字段或实例方法/字段并不重要

除了实例字段和方法已有的功能外,这对多线程没有任何额外的影响。也就是说,只要您意识到静态字段的值在所有实例之间共享。 如果要同步,则需要在类的
java.lang.Class
实例上同步(或者如果该方法是所述类中的静态方法,则可以在静态方法上具有“synchronized”修饰符,以便与在类的
java.lang.Class
实例上同步具有相同的效果)


另外需要注意的是,在JVM中,具有相同名称的类可以由多个类加载器同时加载-因此,Java中的类不是通过其完全限定的名称作为唯一标识符,而是通过用于加载类的
Java.lang.classloader
实例的组合作为唯一标识符,以及完全限定名。

是的,具有静态字段和方法的类只有一个实例,可以通过静态调用访问该实例

如果使用静态方法,则方法中声明的变量是隔离的,不需要同步(与C#::中的相同)

但是,当您的类具有静态变量并且您在静态方法中访问它们时,有一个折衷办法:在执行多线程时,必须同步对静态变量的访问。这就是为什么单线程模式没有像一些人认为的那样好的原因:实例化成本,如果它只是单线程的,甚至更高


经验法则?没有静态类变量的静态方法总是好的。但是,在进行多线程处理时,带有变量的静态类可能变得非常有害。因此,请注意静态瓶颈

您的问题还不清楚:静态类的行为与“普通”类一样,只是它已嵌套到另一个类中。如果您需要静态类是线程安全的,请确保它是线程安全的?不太清楚你在找什么。“静态类”是什么意思?你真的只是指只有静态方法的类吗?静态(嵌入式)类就是类。非静态嵌入类是特殊的:它们有第二个(第三个)外部类(es)。这里的“static”与其他用法有不同的含义。@Marcus如果你真的是指静态类(与静态方法/字段相反),那么答案是它与非静态顶级类没有区别。好吧,我改变了问题,希望现在清楚了。。。