`
BucketLi
  • 浏览: 195098 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
5a76a659-f8e6-3bf3-b39a-8ae8f7a0f9d9
Percolator与分布...
浏览量:5674
社区版块
存档分类
最新评论

一些小细节

 
阅读更多
应用启动初始化的时候有时候会判定下是否已经初始化过了。这个时候会设置一个变量,然后判断,然后设值。如果有概率发生并发的初始化,有可能还要加个锁。非常不简洁。下面这个方式,就让这个检查并设值的原子操作给底下来做吧,比较简洁。

if(!startFlag.compareAndSet(false, true)){
			return;
		}



以前做一些并发性测试的时候用CountDownLatch挺好,对于类似CyclicBarrier只是有个功能上的大概认知。现在发现CyclicBarrier也挺不错的,关键是比较简洁。下面是一个示例,CyclicBarrier还能再促发后运行一个指定Runnable,很方便。
public class CyclicBarrierTest {
    public static void main(String[] args){
    	final CyclicBarrier cb=new CyclicBarrier(10, new Runnable() {
			@Override
			public void run() {
				System.out.println("get here!");
			}
		});
    	
    	for(int i=0;i<100;i++){
    		final int index=i;
    		Thread t=new Thread(new Runnable() {
				@Override
				public void run() {
					System.out.println("i am "+index);
					
					try {
						cb.await();
					} catch (InterruptedException e) {
						e.printStackTrace();
					} catch (BrokenBarrierException e) {
						e.printStackTrace();
					}
				}
			});
    		
    		t.start();
    	}
    }
}


结果类似每10个线程执行下Runnable
i am 0
i am 9
i am 7
i am 5
i am 3
i am 1
i am 13
i am 11
i am 4
i am 2
get here!
i am 6
i am 10
i am 15
i am 8
i am 14
i am 12
i am 17
i am 16
i am 18
i am 20
get here!
i am 22
i am 24
i am 26
i am 28
i am 30
i am 19
i am 21
i am 23
i am 32
i am 25
get here!
i am 34
i am 36
i am 38
i am 29
i am 31
i am 35
i am 37
i am 27
i am 33
i am 39
i am 50
get here!
...


做一些固定EL或者特定语言(比如sql)分析的时候,常常cache一些分析过的结果,但是都用FutureTask来表示。具体这样使用的原因还需要理解,至少我看到过两个地方都是这么使用了。
    /**
     * Compiled Expression cache
     */
    private final static ConcurrentHashMap<String/* text expression */, FutureTask<Expression>/*
                                                                                               * Compiled
                                                                                               * expression
                                                                                               * task
                                                                                               */> cacheExpressions =
            new ConcurrentHashMap<String, FutureTask<Expression>>();



    /**
     * Compile a text expression to Expression object
     * 
     * @param expression
     *            text expression
     * @param cached
     *            Whether to cache the compiled result,make true to cache it.
     * @return
     */
    public static Expression compile(final String expression, boolean cached) {
        if (expression == null || expression.trim().length() == 0) {
            throw new CompileExpressionErrorException("Blank expression");
        }

        if (cached) {
            FutureTask<Expression> task = cacheExpressions.get(expression);
            if (task != null) {
                return getCompiledExpression(expression, task);
            }
            task = new FutureTask<Expression>(new Callable<Expression>() {
                public Expression call() throws Exception {
                    return innerCompile(expression);
                }

            });
            FutureTask<Expression> existedTask = cacheExpressions.putIfAbsent(expression, task);
            if (existedTask == null) {
                existedTask = task;
                existedTask.run();
            }
            return getCompiledExpression(expression, existedTask);

        }
        else {
            return innerCompile(expression);
        }

    }


    private static Expression getCompiledExpression(final String expression, FutureTask<Expression> task) {
        try {
            return task.get();
        }
        catch (Exception e) {
            cacheExpressions.remove(expression);
            throw new CompileExpressionErrorException("Compile expression failure:" + expression, e);
        }
    }


分配id
private static Integer allocateId(Channel channel) {
        Integer id = Integer.valueOf(System.identityHashCode(channel));
        for (;;) {
            // Loop until a unique ID is acquired.
            // It should be found in one loop practically.
            if (allChannels.putIfAbsent(id, channel) == null) {
                // Successfully acquired.
                return id;
            } else {
                // Taken by other channel at almost the same moment.
                id = Integer.valueOf(id.intValue() + 1);
            }
        }
    }
分享到:
评论

相关推荐

    db2日常操作的一些小细节

    db2日常操作的一些小细节主要内容是远程编目节点

    SSH框架整合的一些小细节

    在实际项目开发中,这三者之间的集成涉及到许多小细节,对于初学者来说,理解和掌握这些细节至关重要。 首先,Spring作为核心的依赖注入(DI)和面向切面编程(AOP)框架,它负责管理应用的业务对象和服务。在整合...

    计算机二级心得包括一些小细节,种类不限

    以下便是计算机二级考试准备过程中一些值得重视的小细节,这些内容不限于某一种考试类型,而是普遍适用于多种考试内容。 一、明确考试内容和格式 在准备开始之前,考生需要详细了解计算机二级考试的科目和内容,...

    C语言中关于if语句中的小细节

    接下来将详细介绍C语言中if语句的一些小细节。 首先,关于布尔变量的使用。在C语言中,布尔值并没有一个标准的数据类型,通常使用整型变量来表示布尔值,其中0表示假,非0表示真。然而,使用整型变量代替布尔值时,...

    Surface RT必须了解的小细节.docx

    Surface RT 作为微软推出的旗舰产品,虽然具有很高的期待,但是在使用过程中却存在一些小细节需要留意。以下是使用 Surface RT 需要注意的一些问题。 1. 过于“私人化”的平板电脑 Surface RT 的一个特点是对个人...

    seo优化中的不注意小细节.docx

    以下是基于提供的文件内容,关于SEO优化中需要注意的一些小细节: 1. **原创内容的重要性**:搜索引擎优先考虑独特、有价值的内容。即使在济南这样的地方做网站优化,也要尽量避免过度采集他人的文章,而应该注重...

    带500创作模型的付费创作V2.1.0独立版系统 WEB端+ H5端 + 小程序端

    后台一些小细节的优化及一些小 BUG 的处理,前端进行了些小细节优化,针对上几版大家非常关心的卡密兑换 H5 端及小程序端均正常,该版本为编译版无开源端。开源版近期会单独更新,注意 PHP 版本选择 7.4。

    ChatGPT付费创作系统源码独立版 WEB端+H5端+小程序端.zip

    后台一些小细节的优化及一些小BUG的处理,前端进行了些小细节优化,针对上几版大家非常关心的卡密兑换H5端及小程序端均正常,该版本为编译版无开源端。开源版近期会单独更新,注意PHP版本选择7.4。提供的安装教程...

    ChatGPT付费创作系统V2.1.0独立版 +WEB端+ H5端 + 小程序端

    后台一些小细节的优化及一些小BUG的处理,前端进行了些小细节优化,针对上几版大家非常关心的卡密兑换H5端及小程序端均正常,该版本为编译版无开源端。开源版近期会单独更新,注意PHP版本选择7.4。提供的安装教程...

    chatgpt3.5+GPT4.0+AI绘画小程序H5分销流量主AI人工智能对话问答客服源码付费体验系统openai机器人

    后台一些小细节的优化及一些小BUG的处理,前端进行了些小细节优化,针对上几版大家非常关心的卡密兑换H5端及小程序端均正常,该版本为编译版无开源端。开源版近期会单独更新,注意PHP版本选择7.4。提供的安装教程...

    新手SqlServer数据库dba需要注意的一些小细节

    这些小细节和技巧对于SQL Server DBA来说至关重要,它们可以帮助你更好地管理和维护数据库,预防潜在问题,提升系统的整体性能和稳定性。记住,每个决策都应基于实际业务需求,以确保最佳实践的应用。

    三阶魔方图文教程.doc

    在对好第一面十字的过程中,我们需要注意一些小细节,例如白蓝棱色块在底层,且白色冲下,这个其实最简单,请看动画。 下一步,我们需要对好四个小棱块逐一对好侧面颜色,然后翻下去就行了。请看下边这个动画的例子...

    图像分割实战-系列教程9:U2NET显著性检测实战源码

    Unet的U没变,但是为什么叫U2Net呢,这里的2是平方的意思,实际上就是在一些小细节方面又做了一次Unet结构,每一个小模块不在像之前的Unet使用VGG来做backbones,而是每一个backbones都使用了Unet,即U2Net

    C标准库源代码,C standard library

    因此,代码可能在一些小细节上与书中的内容有所不同。 有十五个子目录,其名称与标准头文件相匹配。这些目录包含了书中提供的所有 *.c 文件。(注意:limits、stdarg 和 stddef 目录是空的。)_headers 目录包含了...

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容...7.优化一些小细节 8.重新布局优化显示及方便操作 9.不断更新中...

    刻录软件NeroBurningROM2017中文特别版(官方原版注册机)

    Nero Burning ROM 2017是一款刻录软件,是Nero 2017 ...新版Nero Burning ROM 2017更新了用户界面还有一些小细节,另外还具有一个重大的更新,那就是在安全方面是无与伦比!复制和导入数据和音乐并刻录在首选类型的光

Global site tag (gtag.js) - Google Analytics