1.还是看之前的例子,写一个synchronized和Atomic的对比
    Atomic是底层基于无锁算法(cas)实现的,synchronized底层是基于有锁算法(aqs)实现的,会走锁升级那块规则流程,在并发竞争激烈的情况下肯定会升级为重量锁的,所以用Atomic的话效率会高很多。

    1. public class AtomicSample {
    2. static int sum = 0;
    3. static AtomicInteger atomicIntegerSum = new AtomicInteger(0);
    4. static int threadCount = 10;
    5. public static void main(String[] args) throws InterruptedException {
    6. synchronizedTest();
    7. AtomicTest();
    8. }
    9. public static void synchronizedTest() throws InterruptedException {
    10. for(int i = 0;i<threadCount;i++){
    11. new Thread(()->{
    12. //普通的做法是加synchronized,但其实是很影响性能,这里可以用Atomic来实现
    13. synchronized (AutoCloseable.class){
    14. for(int j=0;j<1000;j++){
    15. sum++;
    16. }
    17. }
    18. }).start();
    19. }
    20. Thread.sleep(3000);
    21. System.out.println(sum);
    22. }
    23. public static void AtomicTest() throws InterruptedException {
    24. for(int i = 0;i<threadCount;i++){
    25. new Thread(()->{
    26. //用Atomic来实现
    27. for(int j=0;j<1000;j++){
    28. atomicIntegerSum.getAndIncrement();
    29. }
    30. }).start();
    31. }
    32. Thread.sleep(3000);
    33. System.out.println(atomicIntegerSum.get());
    34. }
    35. }

    2.我们再看看getAndIncrement的方法调用:
    image.png.
    image.png
    由此可见,AtomicInteger.incrementAndGet的实现用了乐观锁技术,调用了类sun.misc.Unsafe库里面的 CAS算法,用CPU指令来实现无锁自增。所以,AtomicInteger.incrementAndGet的自增比用synchronized的锁效率倍增。