java上下文切换与并行执行

qlvxas9a  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(319)

我正在努力学习多线程和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。据我所知,程序应该并行运行,但我不确定。

gajydyqb

gajydyqb1#

你的程序确实是并行运行的。在这个特定的例子中,您不需要在代码中使用锁,但是如果没有锁,它会运行得非常好。

vngu2lb8

vngu2lb82#

代码运行正常,但我如何知道代码是按照时间片运行的,还是以并行执行方式运行的。
对这个问题的完整回答必须包括几个因素,但我将简明扼要,主要集中在与这个问题最相关的两点(海事组织)。为了简单起见,我们假设只要有可能,每个线程(由应用程序创建)都将被分配到不同的核心。
首先,它取决于执行应用程序的硬件内核的数量,以及同时运行的线程数(由应用程序创建)。例如,如果硬件只有一个内核,或者如果应用程序创建的线程数超过可用的内核数,那么其中一些线程将不可避免地无法真正并行执行(即,将Map到同一个内核)。
其次,这取决于执行其工作的线程是否彼此同步。在您的代码中,创建了两个线程,使用不同的对象进行同步,并且由于您的机器有4个内核,因此理论上,每个线程彼此并行运行。
它变得更加复杂,因为您可以有并行执行的代码部分,以及由所涉及的线程顺序执行的其他部分。例如,如果 increment1 以及 increment2 方法在同一对象上同步,则这些方法将不会并行执行。

相关问题