标签:引入 空间 record over 系统 轻量级 调度 ++ 完成
synchronized 锁定的是一个对象,执行某段代码的时候必须锁定一个对象,不锁定就无法执行
CAS :compare and swap/compare and exchange
再举个例子:
public static void main(String[] args) throws InterruptedException {
AtomicInteger integer = new AtomicInteger(0);
Thread[] threads = new Thread[10];
// 等待线程结束
CountDownLatch downLatch = new CountDownLatch(threads.length);
for (int i = 0; i < threads.length; i++) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
for (int j = 0; j < 5; j++) {
// 如果是 integer++ 的话就要加锁
integer.incrementAndGet();
}
downLatch.countDown();
}
});
threads[i] = thread;
}
Arrays.stream(threads).forEach(f -> f.start());
downLatch.await();
System.out.println(Thread.currentThread().getName() + "\t" + integer);
}
上面的代码中如果采用 integer++ 这种方式就要进行加锁,采用 integer.incrementAndGet() 就不需要加锁,因为 incrementAndGet 方法底层就是采用的 CAS 实现的,是汇编的一条指令lock cmpxchg 指令。cmpxchg 指令不是原子的,所以需要 lock 指令给 CPU 加锁,只让一个线程操作。
偏向锁、自旋锁都是在用户空间完成
重量级锁都需要向内核空间申请
偏向锁:
自旋锁:
重量级锁:
标签:引入 空间 record over 系统 轻量级 调度 ++ 完成
原文地址:https://www.cnblogs.com/xiexiandong/p/12905374.html