Java8 引入的,相比是比较新的一个类
    高并发下LongAdder比AtomicLong效率高,不过本质是空间换时间
    竞争激烈的情况下,LongAdder把不同线程对应到不同的cell上进行修改,降低了冲突的概率,是多段锁的概念,提高了并发性

    多线程情况下AtomicLong的性能,有16个线程对同一个AtomicLong累加
    由于竞争很激烈,每一次加法,都要flush和refresh,导致很耗费资源

    AtomicLong弊端:每次加法都需要做同步

    1. // AtomicLong
    2. public class AtomicLongDemo {
    3. public static void main(String[] args) {
    4. AtomicLong atomicLong = new AtomicLong(0);
    5. ExecutorService executorService = Executors.newFixedThreadPool(20);
    6. long start = System.currentTimeMillis();
    7. for (int i = 0; i < 10000; i++) {
    8. executorService.submit(new Task(atomicLong));
    9. }
    10. executorService.shutdown();
    11. while (!executorService.isTerminated()){
    12. }
    13. long end = System.currentTimeMillis();
    14. System.out.println(end-start);
    15. System.out.println(atomicLong.get());
    16. }
    17. }
    18. class Task implements Runnable{
    19. public AtomicLong atomicLong;
    20. public Task(AtomicLong atomicLong) {
    21. this.atomicLong = atomicLong;
    22. }
    23. @Override
    24. public void run() {
    25. for (int i = 0; i < 10000; i++) {
    26. atomicLong.getAndIncrement();
    27. }
    28. }
    29. }
    30. //LongAdder
    31. public class LongAdderDemo {
    32. public static void main(String[] args) {
    33. LongAdder longAdder = new LongAdder();
    34. ExecutorService executorService = Executors.newFixedThreadPool(20);
    35. long start = System.currentTimeMillis();
    36. for (int i = 0; i < 10000; i++) {
    37. executorService.submit(new TaskAdder(longAdder));
    38. }
    39. executorService.shutdown();
    40. while (!executorService.isTerminated()){
    41. }
    42. long end = System.currentTimeMillis();
    43. System.out.println(end-start);
    44. System.out.println(longAdder.sum());
    45. }
    46. }
    47. class TaskAdder implements Runnable{
    48. public LongAdder longAdder;
    49. public TaskAdder(LongAdder atomicLong) {
    50. this.longAdder = atomicLong;
    51. }
    52. @Override
    53. public void run() {
    54. for (int i = 0; i < 10000; i++) {
    55. longAdder.increment();
    56. }
    57. }
    58. }