几年前写的那篇文章,确实是才疏学浅,对于锁的问题没有清晰问题,特此致歉
接之前的文章,截取核心问题点
void m() {
synchronized (lock) {
for (int i = 0; i < 1500; i++) {
count++;
}
//查看锁的类型
//System.out.println(Thread.currentThread().getName() + " 1: " + ClassLayout.parseInstance(lock).toPrintable());
}
当for循环在synchronized同步代码块中时,此时某一线程获得锁,便不断累加,此过程并没有锁的操作及上下文的切换
反观AtomicInteger
void n() {
for (int i = 0; i < 1500; i++) {
count1.incrementAndGet();
}
}
incrementAndGet方法是一个CAS自旋操作,每执行一次,都会进行自旋
所以当数据量大到一定规模时,只能说synchronized少做次数的耗费时间大于了synchronized与CAS的差异时间,得出上篇文章的错误结论!
验证方法很简单,当你加大线程数,或减小同步代码块for循环次数时,synchronized方法减去CAS方法的时间会变小甚至会变成负数,