我的项目需要:实现多线程达到数据的亿级自增,并且尽可能让工夫缩短 ,要求:
(1)速度要快
(2)安全性要高
第1种形式

package com.example.currency03;import java.util.concurrent.atomic.AtomicLong;/** * 1· 使用Thread、AtomicLong、线程join实现 */public class Counter1 {    public static AtomicLong inc = new AtomicLong();    public void increase() {        // 数据加一        inc.getAndIncrement();    }    public static void count() throws InterruptedException {        final Counter1 c1 = new Counter1();        Thread  th;        long t1 = System.currentTimeMillis();        for(int i = 0; i < 1000; i++) {            th = new Thread(() -> {                for(int j = 0; j < 100000; j++) {                    c1.increase();                }            });            th.start();            th.join();        }        long t2 = System.currentTimeMillis();        System.out.println("Counter1 , "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 10; i++) {            inc.set(0);            count();        }    }}

消耗工夫如下:

第2种形式

package com.example.currency03;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 2、使用thread、reentrantlock、线程join */public class Counter2 {    public static Integer inc = 0;    Lock lock = new ReentrantLock();    public void increase() {        lock.lock();        try {            inc++;        } finally {            lock.unlock();        }    }    public static void count() throws InterruptedException {        final Counter2 c2 = new Counter2();        Thread th;        Long t1 = System.currentTimeMillis();        for(int i = 0; i < 1000; i++) {            th = new Thread(() -> {                for(int j = 0; j < 100000; j++) {                    c2.increase();                }            });            th.start();            th.join();        }        long t2 = System.currentTimeMillis();        System.out.println("Counter2 , "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 10; i++) {            inc = 0;            count();        }    }}

消耗工夫如下:

第3种形式

package com.example.currency03;/** * 3、使用thread、synchronized、线程join */public class Counter3 {    public static Integer inc = 0;    public synchronized void increase() {        inc++;    }    public static void count() throws InterruptedException {        final Counter3 c3 = new Counter3();        Thread th;        long t1 = System.currentTimeMillis();        for (int i = 0; i < 1000; i++) {            th = new Thread(() -> {                for(int j = 0; j < 100000; j++) {                    c3.increase();                }            });            th.start();            th.join();        }        long t2 = System.currentTimeMillis();        System.out.println("Counter3, "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 10; i++) {            inc = 0;            count();        }    }}

消耗工夫如下:

第4种形式

package com.example.currency03;import java.util.concurrent.atomic.AtomicLong;/** * 4、使用thread、AtomicLong、线程状态TERMINATED */public class Counter4 {    public static AtomicLong inc = new AtomicLong();    public void crease() {        inc.getAndIncrement();    }    public static void count() throws InterruptedException {        final Counter4 c4 = new Counter4();        long t1 = System.currentTimeMillis();        Thread  th = null;        for(int i = 0; i < 1000; i++) {            th = new Thread(() -> {                for(int j = 0; j < 100000; j++) {                    c4.crease();                }            });            th.start();            while(th.getState()!=Thread.State.TERMINATED){                Thread.sleep(1);            }        }        long t2 = System.currentTimeMillis();        System.out.println("Counter4, "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 10; i++) {            inc.set(0);            count();        }    }}

消耗工夫如下:

第5种形式

package com.example.currency03;import java.util.concurrent.atomic.AtomicLong;/** * 5、使用Thread、AtomicLong、线程isAlive等实现 */public class Counter5 {    public static AtomicLong inc = new AtomicLong();    public void increase() {        inc.getAndIncrement();    }    public static void count() throws InterruptedException {        final Counter5 c5 = new Counter5();        Thread  th = null;        long t1 = System.currentTimeMillis();        for(int i = 0; i < 1000; i++) {            th = new Thread(() -> {                for(int j = 0; j < 100000; j++) {                    c5.increase();                }            });            th.start();            while(th.isAlive()){                Thread.sleep(1);            }        }        long t2 = System.currentTimeMillis();        System.out.println("Counter5, "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 10; i++) {            inc.set(0);            count();        }    }}

消耗工夫如下:

第6种形式

package com.example.currency03;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutionException;/** * 6、使用Thread、synchronized、线程CountDownLatch等实现 */public class Counter6 {    public static int inc = 0;    public synchronized static void increase() {        inc++;    }    public static void count() throws InterruptedException {        int threadCount = 1000;        long t1 = System.currentTimeMillis();        CountDownLatch countDownLatch = new CountDownLatch(threadCount);        for(int i = 0; i < threadCount; i++) {            new Thread(() -> {                try {                    for (int j = 0; j < 100000; j++) {                        increase();                    }                } finally {                    countDownLatch.countDown();                }            }).start();        }        countDownLatch.await();        long t2 = System.currentTimeMillis();        System.out.println("Counter6, "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }    public static void main(String[] args) throws ExecutionException, InterruptedException {        for (int i = 0; i < 10; i++) {            inc = 0;            count();        }    }}

消耗工夫如下:

第7种形式

package com.example.currency03;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutionException;import java.util.concurrent.atomic.AtomicLong;/** * 7、使用Thread、AtomicLong、线程CountDownLatch等实现 */public class Counter7 {    public static AtomicLong inc = new AtomicLong(0);    public static void increase() {        inc.getAndIncrement();    }    public static void count() throws InterruptedException {        int threadCount = 1000;        long t1 = System.currentTimeMillis();        CountDownLatch countDownLatch = new CountDownLatch(threadCount);        for(int i = 0; i < threadCount; i++) {            new Thread(() -> {            try {                    for(int j = 0; j < 100000; j++) {                        increase();                    }            } finally {                countDownLatch.countDown();            }        }).start();        }        countDownLatch.await();        long t2 = System.currentTimeMillis();        System.out.println("Counter7, "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }    public static void main(String[] args) throws ExecutionException, InterruptedException {        for (int i = 0; i < 10; i++) {            inc.set(0);            count();        }    }}

消耗工夫如下:

第8种形式

package com.example.currency03;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutionException;import java.util.concurrent.atomic.LongAdder;/** * 8、使用Thread、LongAddr、线程CountDownLatch等实现 */public class Counter8 {    public static LongAdder longAdder = new LongAdder();    public static void increase() {        longAdder.increment();    }    public static void count() throws InterruptedException {        int threadCount = 1000;        long t1 = System.currentTimeMillis();        CountDownLatch countDownLatch = new CountDownLatch(threadCount);        for (int i = 0; i < threadCount; i++) {            new Thread(() -> {                try {                    for (int j = 0; j < 100000; j++) {                        increase();                    }                } finally {                    countDownLatch.countDown();                }            }).start();        }        countDownLatch.await();        long t2 = System.currentTimeMillis();        System.out.println("Counter8, " + String.format("后果:%s,耗时(ms):%s", longAdder.sum(), (t2 - t1)));    }    public static void main(String[] args) throws ExecutionException, InterruptedException {        for (int i = 0; i < 10; i++) {            longAdder.reset();            count();        }    }}

消耗工夫如下:

第9种形式

package com.example.currency03;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutionException;import java.util.concurrent.atomic.LongAccumulator;/** * 9、使用Thread、LongAccumulator、线程CountDownLatch等实现 */public class Counter9 {    private static LongAccumulator inc = new LongAccumulator((x, y) -> x + y, 0L);    public static void incr() {        inc.accumulate(1);    }    public static void count() throws InterruptedException {        int threadCount = 1000;        long t1 = System.currentTimeMillis();        CountDownLatch countDownLatch = new CountDownLatch(threadCount);        for(int i = 0; i < threadCount; i++) {            new Thread(() -> {                try {                    for(int j = 0; j < 100000; j++) {                        incr();                    }                } finally {                    countDownLatch.countDown();                }            }).start();        }        countDownLatch.await();        long t2 = System.currentTimeMillis();        System.out.println("Counter9, "+String.format("后果:%s,耗时(ms):%s", inc.longValue(), (t2 - t1)));    }    public static void main(String[] args) throws ExecutionException, InterruptedException {        for (int i = 0; i < 10; i++) {            inc.reset();            count();        }    }}

消耗工夫如下:

第10种形式

package com.example.currency03;import java.util.concurrent.atomic.LongAdder;/** * 10、使用Thread、LongAdder、线程join的实现 */public class Counter10 {    public static LongAdder inc = new LongAdder();    public  void increase() {        inc.increment();    }    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 10; i++) {            inc.reset();            count();        }    }    private static void count() throws InterruptedException {        final Counter10 test = new Counter10();        Thread  th;        long t1 = System.currentTimeMillis();        for(int i=0;i<1000;i++){            th= new Thread(() -> {                for(int j = 0;j < 100000;j++) {                    test.increase();                }            });            th.start();            th.join();        }        long t2 = System.currentTimeMillis();        System.out.println("Counter10 , "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }}

消耗工夫如下:

第11种形式

package com.example.currency03;import java.util.concurrent.atomic.LongAccumulator;/** * 使用Thread、LongAccumulator、线程join的实现 */public class Counter11 {    static LongAccumulator inc = new LongAccumulator((x, y) -> x + y, 0L);    public  void increase() {        inc.accumulate(1);    }    public static void main(String[] args) throws InterruptedException {        for (int i = 0; i < 10; i++) {            inc.reset();            count();        }    }    private static void count() throws InterruptedException {        final Counter11 test = new Counter11();        Thread  th;        long t1 = System.currentTimeMillis();        for(int i=0;i<1000;i++){            th= new Thread(() -> {                for(int j = 0; j < 100000; j++) {                    test.increase();                }            });            th.start();            th.join();        }        long t2 = System.currentTimeMillis();        System.out.println("Counter11 , "+String.format("后果:%s,耗时(ms):%s", inc, (t2 - t1)));    }}

消耗工夫如下:

GITHUB