1. import java.util.concurrent.atomic.AtomicInteger;
    2. import java.util.concurrent.atomic.AtomicLong;
    3. import java.util.concurrent.atomic.LongAdder;
    4. /**
    5. * @version 1.0.0
    6. * @Author Meir
    7. * @copyright(C)
    8. */
    9. public class SynchronizedTest {
    10. /**
    11. * 性能 LongAdder > AtomicInteger > 直接加synchronized
    12. */
    13. public static void main(String[] args) throws InterruptedException {
    14. At a = new At();
    15. long l1 = System.currentTimeMillis();
    16. Thread thread = new Thread(() -> {
    17. for (int i = 0; i < 1000000; i++) {
    18. a.atomicIntegerIncrease();
    19. }
    20. });
    21. thread.start();
    22. for (int i = 0; i < 1000000; i++) {
    23. a.atomicIntegerIncrease();
    24. }
    25. thread.join();
    26. System.out.println(System.currentTimeMillis() - l1);
    27. System.out.println(a.getNum(
    28. ));
    29. }
    30. static class At {
    31. int num = 0;
    32. //1.原子操作integer
    33. //内部实现-CAS 比较并交换
    34. AtomicInteger atomicInteger = new AtomicInteger();
    35. //2.
    36. LongAdder longAdder = new LongAdder();
    37. public int getNum() {
    38. // return num;
    39. return atomicInteger.get();
    40. // return longAdder.longValue();
    41. }
    42. // 不加锁不安全
    43. public void increase() {
    44. num ++;
    45. }
    46. /**
    47. * synchronized锁的是同步代码块 this方法
    48. */
    49. public synchronized void synchronizedIncrease() {
    50. num ++;
    51. //效果一样 锁的是同步代码块 this方法
    52. // synchronized (this) {
    53. // num ++;
    54. // }
    55. }
    56. /**
    57. * AtomicInteger
    58. */
    59. public synchronized void atomicIntegerIncrease() {
    60. atomicInteger.incrementAndGet();
    61. //实现步骤 自旋比较
    62. //CAS机制中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。
    63. //更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。
    64. // while (true) {
    65. // int oldNum = atomicInteger.get();
    66. // int newNum = oldNum + 1;
    67. // //compareAndSet底层是一个原子操作 c++对他底层汇编的cmoxchgq(Compare exchange 比较交换)方法有加锁 (缓存行锁/总线锁)
    68. // if (atomicInteger.compareAndSet(oldNum, newNum)) {
    69. // break;
    70. // }
    71. // }
    72. //ABA问题 :有线程在改值时 拿到旧值A 在+1生成B时另一线程如果速度更快 把旧值A改成C再改成A
    73. //解决:加版本号version 每次操作版本+1 C改A版本就是3 1线程A改B就会发现版本不一致不修改
    74. //例如类:AtomicStampedReference compareAndSet方法加了stamp标记
    75. }
    76. /**
    77. * LongAdder
    78. */
    79. public synchronized void LongAdderIncrease() {
    80. //底层实现CAS分段优化机制 自动迁移机制
    81. //当多个线程进行修改时,使用多个cell单元格,每个cell value初始值为0,分散多个线程的请求压力
    82. //如果需要求和 则将base和所有的cell加起来即可
    83. //当线程增多,每个cell中分配的线程数也会增多,当其中一个线程操作失败的时候
    84. //它会自动迁移到下一个cell中进行操作,这也就解决了CAS空旋转,自旋不停等待的问题。这就是 自动迁移机制。
    85. longAdder.increment();
    86. }
    87. }
    88. }