最近在看《实战 Java 高并发程序设计》,遇到一些问题,所以简单记录一下。上面两个参考资料都非常不错,由于时间有限,并没有全部看完,有些地方也不能完全看懂。第二个参考资料偏 C++,如果要看 Java 相关的书,或许可以看看《The Art of Multiprocessor Programming》。
So blocking is at least as fast as lockfree, while it can be faster (when it happened so that the fastest known algorithm is at least partially blocking).
publicstaticclassAddThreadimplementsRunnable { publicvoidrun() { synchronized (AtomicIntegerDemo.class) { for (intk=0; k < 10000000; k++) { i++; } } } }
publicstaticvoidmain(String[] args)throws InterruptedException { Thread[] ts = newThread[10]; for (intk=0; k < 10; k++) { ts[k] = newThread(newAddThread()); } longs= System.nanoTime(); for (intk=0; k < 10; k++) { ts[k].start(); } for (intk=0; k < 10; k++) { ts[k].join(); } longe= System.nanoTime(); System.out.println((e - s) / 1000000.); } }
我们使用 start /affinity 1 java geym.conc.ch4.atomic.AtomicIntegerDemo 命令设置程序的 CPU 亲和性,测试 AtomicInteger 代码在单核上的耗时,得到大约 500 ms 的输出,毕竟使用的是同一个 CPU 缓存,性能更高在意料之中。那么,如果设置使用锁的代码亲和单个 CPU,得到的结果依然是十几毫秒,毕竟加锁就是严格串行的,无法利用多核 CPU 的资源,即使在单核上执行也不会影响多少性能。