java - 上下文切换与并行执行
问题描述
我正在尝试学习 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。据我了解,该程序应该以并行执行的方式运行,但我不确定。
解决方案
代码运行正常,但我怎么知道代码是按照时间分片运行的,还是并行执行的。
这个问题的完整答案必须涵盖几个因素,但我将简明扼要并主要关注与这个问题最相关的两个点(IMO)。为简单起见,让我们假设尽可能每个线程(由应用程序创建)将分配给不同的核心。
首先,它取决于执行应用程序的硬件内核数量,以及同时运行的线程数(由应用程序创建)。例如,如果硬件只有一个内核,或者如果应用程序创建的线程多于可用内核的数量,那么其中一些线程将不可避免地不会真正并行执行(即,将映射到同一个内核)。
其次,这取决于执行其工作的线程是否彼此同步。在您的代码中,创建了两个线程,使用不同的对象进行同步,并且由于您的机器有 4 个内核,理论上,每个线程彼此并行运行。
它变得比这更复杂,因为您可以让部分代码并行执行,而其他部分则由所涉及的线程按顺序执行。例如,如果increment1
和increment2
方法在同一个对象上同步,那么这些方法将不会并行执行。
推荐阅读
- amazon-web-services - 从 http 到 https 的 Cloudfront 重定向是否保留请求标头
- express - JSforce 未与 Node 中的 express 集成
- node.js - SyntaxError: Unexpected token } in JSON at position 102
- aws-amplify - 在“./src”中找不到文件“./aws-exports”
- r - 使用 gsub 替换特定列中的字符串
- python - 设备上没有剩余空间(谷歌云上的 Linux VM 实例)
- flask - 没有文件名的烧瓶上传文件API
- mp4 - MOV 或 MP4 容器中支持的 AVC 配置文件
- azure-api-management - 用于白名单的 Azure API 管理 IP
- api - Microsoft Graph API - 关注站点