首页 > 解决方案 > 上下文切换与并行执行

问题描述

我正在尝试学习 Java 中的多线程和并行执行。我写了这样的示例代码:

public class MemoryManagement1 {

public static int counter1 = 0;
public static int counter2 = 0;

public static final Object lock1= new Object();
public static final Object lock2= new Object();



public static  void increment1() {
    synchronized(lock1) {
        counter1 ++;
    }
    
}

public static  void increment2() {
    synchronized(lock2) {
        counter2 ++;
    }
}

public static void processes() {

    Thread thread1 = new Thread(new Runnable() {

        @Override
        public void run() {
            for (int i = 0; i < 4; i++) {
                increment1();
            }

        }

    });

    Thread thread2 = new Thread(new Runnable() {

        @Override
        public void run() {
            for (int i = 0; i < 4; i++) {
                increment2();
            }

        }

    });

    thread1.start();
    thread2.start();


    try {
        thread1.join();
        thread2.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Counter value is :" + counter1);
    System.out.println("Counter value is :" + counter2);


}

public static void main(String[] args) {

    processes();

 }

}

代码运行正常,但我怎么知道代码是按照时间分片运行的,还是并行执行的。我有一个 4 核的 CPU。据我了解,该程序应该以并行执行的方式运行,但我不确定。

标签: javamultithreadingperformanceparallel-processing

解决方案


代码运行正常,但我怎么知道代码是按照时间分片运行的,还是并行执行的。

这个问题的完整答案必须涵盖几个因素,但我将简明扼要并主要关注与这个问题最相关的两个点(IMO)。为简单起见,让我们假设尽可能每个线程(由应用程序创建)将分配给不同的核心。

首先,它取决于执行应用程序的硬件内核数量,以及同时运行的线程数(由应用程序创建)。例如,如果硬件只有一个内核,或者如果应用程序创建的线程多于可用内核的数量,那么其中一些线程将不可避免地不会真正并行执行(即,将映射到同一个内核)。

其次,这取决于执行其工作的线程是否彼此同步。在您的代码中,创建了两个线程,使用不同的对象进行同步,并且由于您的机器有 4 个内核,理论上,每个线程彼此并行运行。

它变得比这更复杂,因为您可以让部分代码并行执行,而其他部分则由所涉及的线程按顺序执行。例如,如果increment1increment2方法在同一个对象上同步,那么这些方法将不会并行执行。


推荐阅读