Tag: 并发

Java中的LRU缓存实现

我已经看到了以下代码,我认为在addElement方法的实现中有一个无用的while循环。 它应该永远不会出现比size + 1更多的元素,因为已经存在写锁定。 那么为什么addElement方法会删除元素,直到它得到这个条件为真 while(concurrentLinkedQueue.size() >=maxSize) 围绕这个的任何指针都会很棒。 这是实施: public class LRUCache { private ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue(); private ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap(); private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private Lock readLock = readWriteLock.readLock(); private Lock writeLock = readWriteLock.writeLock(); int maxSize=0; public LRUCache(final int MAX_SIZE){ this.maxSize=MAX_SIZE; } public V getElement(K key){ readLock.lock(); try […]

在固定时间后中断线程,它是否必须抛出InterruptedException?

我想在一段固定的时间后中断一个线程。 其他人问了同样的问题,最高投票的答案( https://stackoverflow.com/a/2275596/1310503 )给出了下面的解决方案,我稍微缩短了。 import java.util.Arrays; import java.util.concurrent.*; public class Test { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.invokeAll(Arrays.asList(new Task()), 2, TimeUnit.SECONDS); executor.shutdown(); } } class Task implements Callable { public String call() throws Exception { try { System.out.println(“Started..”); Thread.sleep(4000); // Just to demo a long running task of […]

AtomicLong运营

我需要执行以下操作: // average, total, elapsed are Long’s average = ( ( total * average ) + elapsed ) / (++total); 但我想使用AtomicLong 这就是我正在尝试但如果它是正确的我不会得到: average.set( (( total.get() * average.get() ) + elapsed) / total.getAndIncrement() ); 我怎么知道这是否正确?

列表中这两个同步用法之间的行为有何不同?

List list = new ArrayList(); list.add(“a”); … list.add(“z”); synchronized(list) { Iterator i = list.iterator(); while(i.hasNext()) { … } } 和 List list = new ArrayList(); list.add(“a”); … list.add(“z”); List synchronizedList = Collections.synchronizedList(list); synchronized(synchronizedList) { Iterator i = synchronizedList.iterator(); while(i.hasNext()) { … } } 具体来说,当同步列表提供对列表的线程安全访问时,我不清楚为什么在第二个实例中需要同步。

并发 – 以线程安全的方式获取MongoDB生成的通过Java插入的对象的ID

获取通过Java插入的文档的Mongo生成ID的最佳方法是什么。 插入文档的Java进程是multithreading的,这意味着我们需要一些primefaces方式来插入和返回对象的ID。 另外,如果我们设置一个唯一索引,如果该对象是重复的,是否会返回一个ID? 谢谢!

如何立即释放等待BlockingQueue的线程

考虑一个BlockingQueue和几个等待poll(long, TimeUnit)线程poll(long, TimeUnit) (也可能在on take() )。 现在队列是空的,并且希望通知等待的线程他们可以停止等待。 预期的行为是返回null或抛出声明的InterruptedException 。 由于线程正在等待内部锁, Object.notify()将无法用于Object.notify() 。 有任何直截了当的方式吗?

在与中断线程的关系之前,是否在线程上调用interrupt()

换句话说,我想知道在中断线程中检测到中断时,在中断之前更改变量是否始终可见。 例如 private int sharedVariable; public static void interruptTest() { Thread someThread = new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { // Is it here guaranteed that changes before interrupt are always visible here? System.out.println(sharedVariable); } }); someThread.start(); Thread.sleep(1000); sharedVariable = 10; someThread.interrupt(); } 我试图在Java语言规范和Java教程 中提到的java.util.concurrent包的Summary页面中找到答案,但没有提到interrupt 。 我知道volatile和其他同步原语但我需要它们吗?

在Java 6中使用的最佳方法,可以同时访问List

我有一个由多个线程访问的List对象。 主要有一个线程,在某些情况下有两个线程,用于更新列表。 根据正在处理的用户请求数,有一到五个可以从此列表中读取的线程。 该列表不是要执行的任务队列,它是正在检索和同时更新的域对象的列表。 现在有几种方法可以访问此列表的线程安全: – 使用同步块 – 使用普通锁 (即读写操作共享相同的锁) – 使用ReadWriteLock – 使用一个新的ConcurrentBLABLBA集合类 我的问题: 什么是最佳使用方法,因为cricital部分通常不包含大量操作(大多数只是添加/删除/插入或从列表中获取元素)? 你能推荐另一种方法,上面未列出吗? 有些限制 – 最佳性能至关重要,内存使用不是那么多 -it必须是有序列表(当前在ArrayList上同步),尽管不是排序列表(即不使用Comparable或Comparator排序,但根据插入顺序排序) – 列表很大,包含多达100000个域对象,因此使用像CopyOnWriteArrayList这样的东西是不可行的 – 写入/更新电路部分通常非常快,做简单的添加/删除/插入或替换(设置​​) – 大多数时候,读取操作主要执行elementAt(索引)调用,尽管某些读取操作可能会进行二分查找,或者indexOf(元素) – 不会对列表进行直接迭代,但像indexOf(..)这样的操作将遍历列表

并发log4j

我有自己的日志引擎,它将日志写入带有阻塞队列的单独线程。 为了使用“标准软件”,我正在考虑切换到log4j。 我不希望我的高度并发软件被日志命令放慢速度,这些日志命令将所有内容写入磁盘,就像调用命令一样。 可以将log4j用作垃圾箱吗?

为什么Cache.asMap()与Cache.size()不一致?

在Guava库中,我很困惑为什么Cache.asMap()与Cache.size()不一致,除非Cache.cleanUp() 。 Cache cache = CacheBuilder.newBuilder() .expireAfterWrite(1, TimeUnit.SECONDS) .build(); cache.get(…); … //After some seconds, all entries are expired. //cache.asMap() is EMPTY Map, but cache.size() != 0 所以我的问题是: Cache.asMap()与Cache.size()不一致是错误吗? 虽然我注意到Cache.size()的javadoc是: /** * Returns the **approximate** number of entries in this cache. */ 我猜它可能与并发环境有关。 而Cache.cleanUp()究竟做了什么?