标签: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"); } }
标签:hdf 方法 elf back self 默认 rri 第一个 init
原文地址:https://www.cnblogs.com/zqyanywn/p/10150532.html