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(); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


