码迷,mamicode.com
首页 > 其他好文 > 详细

AtomicBoolean

时间:2018-12-20 18:47:08      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:hdf   方法   elf   back   self   默认   rri   第一个   init   

它的两种用法:

     1.保证某段语句只执行一次。

       首先我们要知道compareAndSet的作用,判断对象当时内部值是否为第一个参数,如果是则更新为第二个参数,且返回ture,否则返回false。那么默认初始化为false,则一个线程把他变为ture,compareAndSet返回ture,进入方法体执行逻辑,那么其他的任何线程进入该方法执行compareAndSet时第一个参数为false,而对象的内部值已经被修改为true,则永远过不了if。

 

AtomicBoolean called = new AtomicBoolean(false);

            final Envelope self = this;
            TimeoutTaskReceipt timeoutTaskReceipt = thdf.submitTimeoutTask(new Runnable() {
                @Override
                public void run() {
                    self.timeout();
                }
            }, TimeUnit.MILLISECONDS, msg.getTimeout());

            @Override
            public void ack(MessageReply reply) {
                count(msg);

                envelopes.remove(msg.getId());

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

                timeoutTaskReceipt.cancel();

                callback.run(reply);
            }

  

 2.保证该方法只有一个线程执行,类似于锁的操作

            参考一,init方法只执行1次,那么方法执行结束的时候我把对象的值变成false,compareAndSet可以继续可以将对象则的值设置成true,返回true。

 @Override    
     public void run() {     
         if (exists.compareAndSet(false, true)) {    
             
             exists.set(false);      
        } else {    
             System.out.println(name + " give up");    
        }    
    
    }

  

AtomicBoolean

标签:hdf   方法   elf   back   self   默认   rri   第一个   init   

原文地址:https://www.cnblogs.com/zqyanywn/p/10150532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!