Java Sequence Generator示例分享
下文笔者讲述使用Sequence Generator生成线程安全的计数器的示例分享,如下所示
Sequence Generator源码分析
package com.java265; public interface SequenceGenerator { long getNext(); }
非线程安全的序列号生成示例
package com.java265; public class UnSafeSequenceGenerator implements SequenceGenerator { private long value = 1; @Override public long getNext() { return value++; } }
线程安全的序列号生成
package com.java265; public class SyncSequenceGenerator implements SequenceGenerator { private long value = 1; @Override public synchronized long getNext() { return value++; } }
atomic示例之AtomicLong类分享
package com.java265; import java.util.concurrent.atomic.AtomicLong; public class AtomicSequenceGenerator implements SequenceGenerator { private AtomicLong value = new AtomicLong(1); @Override public long getNext() { return value.getAndIncrement(); } }
并发访问的示例
package com.java265.concurrency.examples.sequence; import com.java265.SequenceGenerator; import java.util.Arraylist; import java.util.List; import java.util.concurrent.Callable; public class PrintSequenceCallable implements Callable<List<Long>> { private SequenceGenerator sequenceGenerator; public PrintSequenceCallable(SequenceGenerator sequenceGenerator) { this.sequenceGenerator = sequenceGenerator; } @Override public List<Long> call() throws Exception { List<Long> ids = new ArrayList<>(); for (int i = 1; i <= 10; i++) { Thread.sleep(100); //take a nap ids.add(sequenceGenerator.getNext()); } return ids; }; } //启动3个线程以测试序列生成器 package com.java265.concurrency.examples.sequence; import com.java265.SequenceGenerator; import com.java265.UnSafeSequenceGenerator; import java.util.List; import java.util.concurrent.*; public class Main { public static void main(String[] args) { SequenceGenerator sequenceGenerator = new UnSafeSequenceGenerator(); //SequenceGenerator sequenceGenerator = new SyncSequenceGenerator(); //SequenceGenerator sequenceGenerator = new AtomicSequenceGenerator(); ExecutorService executor = Executors.newCachedThreadPool(); try { // simulate 3 threads concurrent access the sequence generator Callable<List<Long>> task1 = new PrintSequenceCallable(sequenceGenerator); Callable<List<Long>> task2 = new PrintSequenceCallable(sequenceGenerator); Callable<List<Long>> task3 = new PrintSequenceCallable(sequenceGenerator); Future f1 = executor.submit(task1); Future f2 = executor.submit(task2); Future f3 = executor.submit(task3); System.out.println(f1.get()); System.out.println(f2.get()); System.out.println(f3.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。