Java Sequence Generator示例分享

乔欣 Java经验 发布时间:2023-02-01 10:06:44 阅读数:6124 1
下文笔者讲述使用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();
        }
 
    }
 
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202302/16752179925603.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者