博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 利用cas算法模拟多线程并发抢票
阅读量:4026 次
发布时间:2019-05-24

本文共 3348 字,大约阅读时间需要 11 分钟。

利用cas算法实现。基于乐观锁。如果值发生冲突。加入异步线程递归进行抢(设置递归次数。防止死循环)

1、创建ThreadUtils类

/** * 线程副本,保证数据 */public class ThreadUtils {    private static ThreadLocal
threadLocal; static{ threadLocal = new ThreadLocal(); } public static void set(int value){ threadLocal.set(value); } public static Integer get(){ return threadLocal.get(); }}

2、创建CasUtils类

/** * 基于cas原理实现高并发 */public class CasUtils implements Runnable{    /**      * 私有内部类创建单例     */    private static class AtomicHolder{        private static volatile AtomicInteger s = new AtomicInteger(ThreadUtils.get());    }    /**     * 线程池     */    private  static ThreadPoolExecutor ex;    static {         ex = new ThreadPoolExecutor(                10,10,5,TimeUnit.SECONDS,                new ArrayBlockingQueue
(1), new ThreadPoolExecutor.DiscardOldestPolicy()); } public CasUtils()throws Exception{ int value = ThreadUtils.get(); if(!AtomicHolder.s.compareAndSet(value,value)){ /** * 此处对于未赋值的进行其他操作 */ } } @Override public void run() { System.out.println("我在抢票中..."+Thread.currentThread()); try { int value = AtomicHolder.s.get(); int si = 0; if(value-1>=0&&(si=AtomicHolder.s.decrementAndGet())>0){ /** * 涉及业务可以写入消息队列 */ System.out.println("抢票成功..."+Thread.currentThread()+"========"+(si)); }else{ /*if(value-1<0){ System.out.println("暂无票..."+Thread.currentThread()+"========"+(si)); return; }*/ ex.execute(new Runnable() { @Override public void run() { System.out.println("抢票循环..."+Thread.currentThread()); boolean isSubmit = true; //设置抢票循环次数。 int time = 0; while(isSubmit){ ++time; int value = AtomicHolder.s.get(); //超过10次结束 if(time>=10){ System.out.println("抢票结束【未抢到】..."+Thread.currentThread()); isSubmit = false; break; } if(value-1>=0&&AtomicHolder.s.decrementAndGet()>0){ /** * 涉及业务可以写入消息队列 */ isSubmit = false; System.out.println("抢票成功..."+Thread.currentThread()); } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } } }); } Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }}

 

3、执行public static void main(String[] args) throws Exception {    for(int i=0;i<100;i++){        ThreadUtils.set(10);        new Thread( new CasUtils()).start();    }}

 

转载地址:http://rlvbi.baihongyu.com/

你可能感兴趣的文章
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
js弹窗插件
查看>>
自定义 select 下拉框 多选插件
查看>>
js判断数组内是否有重复值
查看>>
js获取url链接携带的参数值
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
jtag dump内存数据
查看>>
linux和windows内存布局验证
查看>>
linux config
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>
linux dump_backtrace
查看>>