芭乐非常有用。
现在,我想在一段时间内实现一个访问计数器的限制。(例如,人们可以在一个小时内最多执行3次)
使用Guava的mapMarker或缓存非常简单…(就像使用memcached),但我在增加map中的计数器时遇到了一些并发问题。
Guava能像memcache一样支持incr操作吗?当map的值是整型时?或者为此创建一个新的util类。
发布于 2012-02-28 15:54:27
你可以存储一个Semaphore (link)而不是一个普通的整数。看看方法tryAcquire()。对于定期重置许可数量,您可以使用drain()和release()的组合。如果在很短的一段时间内耗尽许可证是有问题的,您还可以使用AtomicInteger并执行以下操作:
1)使用get()查看当前值
2)如果还有配额,尝试通过compareAndSet(oldValue, oldValue + 1)获取一个配额。
3)如果值更新成功(即返回true ),则允许线程继续运行。如果不是,线程必须从(1)开始重试。
4)要重置许可证数量,请使用set()
发布于 2012-02-29 02:15:51
我相信Guava目前正在开发一个类似于这样的速率限制的API。它可能不会进入Guava 12,但13或14似乎是合理的可能性。
发布于 2012-02-29 20:36:30
如果您有整数值,那么您可能希望使用最近发布的AtomicLongMap。
https://stackoverflow.com/questions/9478102
复制相似问题