PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: ✅
作者回复: AtomicLong 里用的就是volatile的long
作者回复: Atomic之所以是线程安全的,就是因为它是有性能代价的。所以Atomic的目的是为了线程安全,不是为了性能更好。之所以10个thread都调用AtomicLong的方法,还不出问题,就是因为里面有很多很多很多的代码,保证了对AtomicLong的对象的操作是线程安全的。安全都是有代价的。 如果有兴趣,可以去看一下AtomicLong的incrementAndGet方法,它其实有一个循环的。而我们在多个线程并发去调用这个方法,冲突的几率大了很多,while循环其实是执行了很多次的。这时候,反而是少用几个线程,速度更快。 就好像很多人抢着干活,往同一张纸上画画,其实就是在互相捣乱。而AtomicLong可以保证最终画出来的画不会乱。当然,这是有代价的,很多人画的东西就会被擦掉,重新画。 public final long getAndAddLong(Object o, long offset, long delta) { long v; do { v = getLongVolatile(o, offset); } while (!compareAndSwapLong(o, offset, v, v + delta)); return v; }
作者回复: 要做100个任务,让20个人并行去做,那就是每个人做五个。这个除法就是算这个数字的
作者回复: primary和atomic之间是存在资源争抢的是吗? 这些线程都是跑在同一个机器的同一个进程里,资源肯定是有竞争的。这些线程又主要是计算密集型的(没有磁盘、网络等IO操作),所以主要抢的就是CPU。 具体竞争下了是啥结果,这个和具体的执行环境与配置是有关系的。如果线程数量和CPU的核数一样,应该没有太多竞争关系。