线程上下文切换
2021-02-01 06:18
标签:system 上下 分片 垃圾 data contain 可见 thread contexts 线程上下文切换(Thread Context Switch ) 上面3种测试都是计算10000*10000次++操作,单个线程下执行只需要4ms,而10000个线程的情况下执行1422ms。由此可见线程上下文切换带来的性能消耗是很大的。而单线程情况下使用synchronized关键字,也需要567ms。 线程上下文切换 标签:system 上下 分片 垃圾 data contain 可见 thread contexts 原文地址:https://www.cnblogs.com/caoxb/p/12814269.html
public class LockSupportTest {
public static void main(String[] args) throws InterruptedException {
contextSwitchTest();
}
public static long count = 0;
//
public static void contextSwitchTest() {
long start = System.currentTimeMillis();
// 启动10000个线程,表示有10000个线程会来回上下文切换
for (int i = 0; i 10000; i++) {
new Thread(() -> {
synchronized (LockSupportTest.class) {
for (int j = 0; j 10000; j++) {
count++;
}
}
}, "AAA").start();
}
// 主线程 + 后台gc线和,所以这里判断条件为2
while (Thread.activeCount() > 2) {
Thread.yield();
}
long end = System.currentTimeMillis();
System.out.println("最终结果:" + count + "共执行:" + (end - start) + "ms"); // 最终结果:100000000共执行:539ms
}
public static void synchronizedTest() {
long start = System.currentTimeMillis();
for (int i = 0; i 10000 * 10000; i++) {
synchronized (LockSupportTest.class) {
count++;
}
}
long end = System.currentTimeMillis();
System.out.println("最终结果:" + count + "共执行:" + (end - start) + "ms"); // 最终结果:100000000共执行:567ms
}
public static void noSwitchtest() {
long start = System.currentTimeMillis();
for (int i = 0; i 10000 * 10000; i++) {
count++;
}
long end = System.currentTimeMillis();
System.out.println("最终结果:" + count + "共执行:" + (end - start) + "ms"); // 最终结果:100000000共执行:4ms
}
}