标签:system 上下 分片 垃圾 data contain 可见 thread contexts
线程上下文切换(Thread Context Switch )
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 } }
上面3种测试都是计算10000*10000次++操作,单个线程下执行只需要4ms,而10000个线程的情况下执行1422ms。由此可见线程上下文切换带来的性能消耗是很大的。而单线程情况下使用synchronized关键字,也需要567ms。
标签:system 上下 分片 垃圾 data contain 可见 thread contexts
原文地址:https://www.cnblogs.com/caoxb/p/12814269.html