Hos*_*ein 44 java concurrency multithreading
在某处我听说过Thread Affinity和Thread Affinity Executor.但至少在java中我无法找到适当的参考.有人可以向我解释这是什么一回事吗?
Hol*_*ger 49
有两个问题.线程最好与某个CPU(核心)具有亲缘关系,以充分利用其CPU本地缓存.这必须由操作系统处理.
在Java中,观察到在典型的程序中,对象是线程仿射的,即通常在大多数时间仅由一个线程使用.因此,JVM优化器的任务是确保将一个线程所关联的对象放在内存中以便放在一个CPU的缓存中,但是将对象关联到不同的线程,这些线程彼此不太靠近,以避免它们共享一个高速缓存行,否则两个CPU /核心必须经常同步它们.
理想的情况是,CPU可以独立地处理某些对象,而另一个CPU处理放置在不相关的内存区域中的其他对象.
该Java线程亲和1.4版本库试图获得两全其美,通过允许您保留一个逻辑线程的关键线程,并保留完整的内核在大多数性能敏感的线程.不太重要的线程仍将运行超线程的优势.例如,下面的代码片段
AffinityLock al = AffinityLock.acquireLock();
    try {
        // find a cpu on a different socket, otherwise a different core.
        AffinityLock readerLock = al.acquireLock(DIFFERENT_SOCKET, DIFFERENT_CORE);
        new Thread(new SleepRunnable(readerLock, false), "reader").start();
        // find a cpu on the same core, or the same socket, or any free cpu.
        AffinityLock writerLock = readerLock.acquireLock(SAME_CORE, SAME_SOCKET, ANY);
        new Thread(new SleepRunnable(writerLock, false), "writer").start();
        Thread.sleep(200);
    } finally {
        al.release();
    }
    // allocate a whole core to the engine so it doesn't have to compete for resources.
    al = AffinityLock.acquireCore(false);
    new Thread(new SleepRunnable(al, true), "engine").start();
    Thread.sleep(200);
    System.out.println("\nThe assignment of CPUs is\n" + AffinityLock.dumpLocks());
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           11759 次  |  
        
|   最近记录:  |