Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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静态变量和缓存_Java_Multithreading_Static_Affinity - Fatal编程技术网

java静态变量和缓存

java静态变量和缓存,java,multithreading,static,affinity,Java,Multithreading,Static,Affinity,我有两个线程,它们都在读取相同的静态变量(某个大对象-一个包含500_000_000 int的数组) 这两个线程被固定到一个cpu(1和2)(cpu关联)上,因此可以最小化抖动 您知道这两个线程是否会因为静态变量被运行在不同cpu上的两个线程读取而相互减慢速度吗 import net.openhft.affinity.AffinityLock; public class BigObject { public final int[] array = new int[500_000_000

我有两个线程,它们都在读取相同的静态变量(某个大对象-一个包含500_000_000 int的数组)

这两个线程被固定到一个cpu(1和2)(cpu关联)上,因此可以最小化抖动

您知道这两个线程是否会因为静态变量被运行在不同cpu上的两个线程读取而相互减慢速度吗

import net.openhft.affinity.AffinityLock;

public class BigObject {
    public final int[] array = new int[500_000_000];
    public static final  BigObject bo_static = new BigObject();

    public BigObject() {
        for( int i = 0; i<array.length; i++){
            array[i]=i;
        }
    }

    public static void main(String[] args) {
        final Boolean useStatic = true;
        Integer n = 2;
        for( int i = 0; i<n; i++){
            final int k = i;    
            Runnable r = new Runnable() {
                @Override
                public void run() {
                    BigObject b;
                    if( useStatic){
                        b = BigObject.bo_static;
                    }
                    else{
                        b = new BigObject();
                    }
                    try (AffinityLock al = AffinityLock.acquireLock()) {
                        while(true){
                            long nt1 = System.nanoTime();
                            double sum = 0;
                            for( int i : b.array){
                                sum+=i;
                            }
                            long nt2 = System.nanoTime();
                            double dt = (nt2-nt1)*1e-6;
                            System.out.println(k + ": sum " + sum + " " + dt);
                        }
                    }
                }
            };
            new Thread(r).start();
        }
    }   
}
import net.openhft.affinity.AffinityLock;
公共类大对象{
公共最终整数[]数组=新整数[500_000_000];
public static final BigObject bo_static=new BigObject();
公共BigObject(){

对于(inti=0;i,在您的情况下,多线程执行不会减慢速度-因为您只执行读取操作,不需要使CPU之间的任何共享状态无效

根据后台负载的不同,可能存在总线限制等问题,但如果亲缘关系也在操作系统级别定义,则将以易于预取的方式进行更多的CPU间和核心间通信(因为您按顺序访问数据)在单线程的情况下,后台负载也会影响性能,所以没有必要对此争论


如果整个系统专用于您的程序,则现代CPU上的内存带宽约为20Gb/s,足以容纳您的数据集。

您能给我们看一些代码吗?只是添加了一些代码数组,它们总是在堆上分配的,不管您是从静态变量还是局部变量引用它们。在一个CPU上读取内存CPU不应影响另一个CPU的性能(在典型的x86 CPU上)这完全取决于您机器的内存体系结构。如果CPU争用同一总线,则是的,将出现性能下降。唯一的办法是在接近预期用例的条件下进行测试。没有通用答案。静态类成员不是进程间通信的正确方式。您应该更好实现生产者/消费者模式。