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