AtomicInteger getAndUpdate 在 Java 6 上归零
AtomicInteger getAndUpdate to zero on Java 6
我正在尝试使用计数器来检测通过 HTTP 方法发送的文本中唯一单词的数量。由于我需要确保此计数器值的并发性,因此我已将其更改为 AtomicInteger
.
在某些情况下,我想获取计数器的当前值并将其重置为零。如果我理解正确的话,我一定不能像这样分开使用get()
和set(0)
方法,而是使用getAndUpdate()方法,BUT!我不知道如何为此重置实现 IntUnaryOperator 以及是否有可能在 Java 6 服务器上实现它。
谢谢。
public class Server {
static AtomicInteger counter = new AtomicInteger(0);
static class implements HttpHandler {
@Override
public void handle(HttpExchange spojeni) throws IOException {
counter.getAndUpdate(???);
}
}
}
可以使用getAndSet(int newValue)
方法
/**
* Atomically sets to the given value and returns the old value.
*
* @param newValue the new value
* @return the previous value
*/
public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}
或者您可以使用 compareAndSet(int expect, int update)
与初始值相关并且您想要更新新值
/**
* Atomically sets the value to the given updated value
* if the current value {@code ==} the expected value.
*
* @param expect the expected value
* @param update the new value
* @return true if successful. False return indicates that
* the actual value was not equal to the expected value.
*/
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}`
getAndUpdate()
基本上用于当您要根据涉及先前值的某些操作(例如,将值加倍)设置值时。如果您要更新的值始终为零,那么 getAndSet()
是更明显的选择。 getAndSet()
操作在 Java 6 中可用,因此请在此处解决您的问题。
由于在 Java 8 之前没有可用的基于 lamba 的原子更新操作,如果您想在那里实现类似的功能,则需要处理自己的同步或使用 compareAndSet()
方法,可能会重试直到成功。
我正在尝试使用计数器来检测通过 HTTP 方法发送的文本中唯一单词的数量。由于我需要确保此计数器值的并发性,因此我已将其更改为 AtomicInteger
.
在某些情况下,我想获取计数器的当前值并将其重置为零。如果我理解正确的话,我一定不能像这样分开使用get()
和set(0)
方法,而是使用getAndUpdate()方法,BUT!我不知道如何为此重置实现 IntUnaryOperator 以及是否有可能在 Java 6 服务器上实现它。
谢谢。
public class Server {
static AtomicInteger counter = new AtomicInteger(0);
static class implements HttpHandler {
@Override
public void handle(HttpExchange spojeni) throws IOException {
counter.getAndUpdate(???);
}
}
}
可以使用getAndSet(int newValue)
方法
/**
* Atomically sets to the given value and returns the old value.
*
* @param newValue the new value
* @return the previous value
*/
public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}
或者您可以使用 compareAndSet(int expect, int update)
与初始值相关并且您想要更新新值
/**
* Atomically sets the value to the given updated value
* if the current value {@code ==} the expected value.
*
* @param expect the expected value
* @param update the new value
* @return true if successful. False return indicates that
* the actual value was not equal to the expected value.
*/
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}`
getAndUpdate()
基本上用于当您要根据涉及先前值的某些操作(例如,将值加倍)设置值时。如果您要更新的值始终为零,那么 getAndSet()
是更明显的选择。 getAndSet()
操作在 Java 6 中可用,因此请在此处解决您的问题。
由于在 Java 8 之前没有可用的基于 lamba 的原子更新操作,如果您想在那里实现类似的功能,则需要处理自己的同步或使用 compareAndSet()
方法,可能会重试直到成功。