Java 线程和枚举优化

Java 线程和枚举优化,java,jvm,enumeration,Java,Jvm,Enumeration,我在枚举中有一个方法,它被同时运行的多个线程调用 因为JVM只允许在内存中分配枚举的一个实例,所以我猜编译器或JVM本身在某些地方进行了一些优化,以避免线程等待CPU访问与方法相同的内存位置,一次又一次地执行每个线程的方法,从而造成瓶颈 当我将线程数从5更改为300(我通过ScheduledExecutorService执行它们)时,我看不到系统的总体吞吐量有什么不同 是否真的进行了优化,或者事情与我想象中的不同?如果所有方法都是访问(即读取)内存,则没有冲突。如果您不更改值,并且不在实例或静态

我在枚举中有一个方法,它被同时运行的多个线程调用

因为JVM只允许在内存中分配枚举的一个实例,所以我猜编译器或JVM本身在某些地方进行了一些优化,以避免线程等待CPU访问与方法相同的内存位置,一次又一次地执行每个线程的方法,从而造成瓶颈

当我将线程数从5更改为300(我通过ScheduledExecutorService执行它们)时,我看不到系统的总体吞吐量有什么不同


是否真的进行了优化,或者事情与我想象中的不同?

如果所有方法都是访问(即读取)内存,则没有冲突。如果您不更改值,并且不在实例或静态变量中保存值,那么您的方法在没有同步的情况下是“线程安全的”


要么你没有完全说明你的问题,要么根本就没有问题。

如果所有方法都在访问(即读取)内存,那么就没有冲突。如果您不更改值,并且不在实例或静态变量中保存值,那么您的方法在没有同步的情况下是“线程安全的”


要么您没有完全说明您的问题,要么根本没有问题。

您可能看不到吞吐量有任何改善的原因是,通过并行执行任务所产生的任何节省都可能被创建所有这些线程的费用所抵消,如果没有任何代码,或者不知道你的程序在做什么,那就很难说了。请记住,线程的创建和销毁不是免费的,即使使用线程池之类的技术,因此,仅仅创建大量线程并不能保证提高吞吐量。

您可能看不到吞吐量有任何提高的原因是,通过并行执行任务所产生的任何节省都可能被创建所有这些线程的费用所抵消,如果没有任何代码,或者不知道你的程序在做什么,那就很难说了。请记住,即使使用线程池之类的技术,线程的创建和销毁也不是免费的,因此仅创建大量线程并不能保证提高吞吐量。

除非内存访问是只读的,即没有线程更新变量的值,否则吞吐量保持不变。如果您仍然相信并发性问题,请尝试JNI。

除非内存访问是只读的,即没有线程更新变量的值,否则吞吐量保持不变。如果您仍然相信并发性问题,请尝试JNI。

对不起,可能我不清楚。我实际上关心的是CPU如何访问枚举方法分配的特定内存点,而不是枚举方法如何访问内存,无论如何,枚举方法处理的所有对象都是线程安全的。CPU通过将内存地址加载到地址总线并等待值出现在该特定CPU上的任何位置来访问内存。线程化通常涉及中断(一个)CPU、保存上下文以及让程序的其他部分执行一段时间。这比多CPU机器要复杂一点。但是除了“访问”之外,你什么也没说;仅仅读取内存不需要同步,而这正是导致有问题的多线程应用程序速度缓慢的原因。所以我仍然不知道更好的答案。很多线程访问或读取单个枚举值没有问题。对不起,可能我不清楚。我实际上关心的是CPU如何访问枚举方法分配的特定内存点,而不是枚举方法如何访问内存,无论如何,枚举方法处理的所有对象都是线程安全的。CPU通过将内存地址加载到地址总线并等待值出现在该特定CPU上的任何位置来访问内存。线程化通常涉及中断(一个)CPU、保存上下文以及让程序的其他部分执行一段时间。这比多CPU机器要复杂一点。但是除了“访问”之外,你什么也没说;仅仅读取内存不需要同步,而这正是导致有问题的多线程应用程序速度缓慢的原因。所以我仍然不知道更好的答案。大量线程访问或读取单个枚举值没有问题。“JVM只允许在内存中分配枚举的一个实例”。你从哪里得到这个想法的?约书亚·布洛赫的《有效Java》第3条。(我有第二版)“JVM只允许在内存中分配枚举的一个实例”。你从哪里得到这个想法的?约书亚·布洛赫的《有效Java》第3条。(我有第二版)