Tag: 并发

在两个线程和主程序之间共享一个对象

我是Java的新手,我正在参加并发编程课程。 我拼命想要一个最小的工作示例,可以帮助演示我学过的概念,比如使用’synchronized’关键字并跨线程共享一个对象。 一直在搜索,但无法获得基本框架。 Java程序员,请帮忙。

如何在Java的Atomic *类中实现lazySet?

在这个关于Disruptor (一个并发框架)的video中 ,提到了Java的Atomic *类(例如AtomicLong)的lazySet方法。 根据文档 ,此方法“最终设置为给定值”。 有没有人知道实现这个的基本机制是什么(特别是在Windows上的x86,如果这是相关的)。 它不能是InterlockedExchange() ,因为这会设置值并确保在返回之前刷新缓存行,如果我没有弄错的话。

通过ReentrantLock访问的字段是否需要volatile关键字?

我的问题是指使用ReentrantLock是否保证字段的可见性与synchronized关键字提供的方面相同。 例如,在下面的类A中 ,字段sharedData不需要声明为volatile,因为使用了synchronized关键字。 class A { private double sharedData; public synchronized void method() { double temp = sharedData; temp *= 2.5; sharedData = temp + 1; } } 但是,对于使用ReentrantLock的下一个示例,字段上的volatile关键字是否必要? class B { private final ReentrantLock lock = new ReentrantLock(); private volatile double sharedData; public void method() { lock.lock(); try { double temp = sharedData; temp […]

增加核心数时降低性能

我的mac配备了16个核心。 System.out.println(Runtime.getRuntime().availableProcessors()); //16 我正在运行下面的代码,以了解使用我的核心的有效性。 线程’CountFileLineThread’只计算文件中的行数(文件夹中有133个文件) 我在这条线上做笔记: ExecutorService es = Executors.newFixedThreadPool(NUM_CORES); NUM_CORES在1到16之间。 您将从下面的结果中注意到,5个以上内核的性能开始下降。 我不希望6芯及以上的产品“收益递减”(btw,7芯需要超过22分钟,你好?!?!)我的问题是为什么? public class TestCores { public static void main(String args[]) throws Exception { long start = System.currentTimeMillis(); System.out.println(“START”); int NUM_CORES = 1; List files = Util.getFiles(“/Users/adhg/Desktop/DEST/”); System.out.println(“total files: “+files.size()); ExecutorService es = Executors.newFixedThreadPool(NUM_CORES); List<Future> futures = new ArrayList<Future>(); for (File file : files) […]

能够在Future 对象上获得进展

参考java.util.concurrent包和Future接口,我注意到(除非我弄错了)启动冗长任务并能够查询进度的能力仅来自SwingWorker实现类。 这引出了以下问题: 有没有办法在非GUI非Swing应用程序(映像控制台应用程序)中在后台启动冗长的任务并允许其他线程检查进度? 在我看来,没有理由将此function限制在swing / GUI应用程序中。 否则,我看到的唯一可用选项是通过ExecutorService :: submit返回Future对象。 但是,基本Future接口不允许监视进度。

BlockingQueue – 阻止drainTo()方法

BlockingQueue有一个名为drainTo()的方法,但它没有被阻止。 我需要一个我想阻止的队列,但也能够在一个方法中检索排队的对象。 Object first = blockingQueue.take(); if ( blockingQueue.size() > 0 ) blockingQueue.drainTo( list ); 我想上面的代码会起作用,但我正在寻找一个优雅的解决方案。

ConcurrentHashMap put vs putIfAbsent

Java Docs说, putIfAbsent相当于 if (!map.containsKey(key)) return map.put(key, value); else return map.get(key); 因此,如果密钥存在于地图中,则不会更新其值。 它是否正确? 如果我想根据某些标准更新密钥值怎么办? 说过期时间等 这是否是添加和更新缓存的更好的方法? public void AddToCache(T key, V value) { V local = _cache.putifabsent(key, value); if(local.equals(value) && local.IsExpired() == false){ return; } // this is for updating the cache with a new value _cache.put(key, value); }

multithreading搜索操作

我有一个方法需要一系列查询,我需要针对不同的搜索引擎Web API运行它们,例如谷歌或雅虎。 为了并行化进程,为每个查询生成一个线程,然后在最后join ,因为我的应用程序只能在获得每个查询的结果后才能继续。 我目前有以下几点: public abstract class class Query extends Thread { private String query; public abstract Result[] querySearchEngine(); @Override public void run() { Result[] results = querySearchEngine(query); Querier.addResults(results); } } public class GoogleQuery extends Query { public Result querySearchEngine(String query) { // access google rest API } } public class Querier { /* […]

删除()后,ConcurrentLinkedQueue $ Node保留在堆中

我有一个multithreading应用程序编写和读取ConcurrentLinkedQueue,它在概念上用于支持列表/表中的条目。 我最初为此使用了ConcurrentHashMap,效果很好。 需要跟踪订单条目的新要求,因此可以在最早的第一个订单中删除它们,具体取决于某些条件。 ConcurrentLinkedQueue似乎是一个不错的选择,function上它运作良好。 可配置数量的条目保存在内存中,当达到限制时提供新条目时,将以最早的顺序搜索队列以查找可以删除的队列。 系统不会删除某些条目并等待客户端交互。 似乎正在发生的事情是我在队列的前面有一个条目,比如100K条目之前。 队列似乎具有有限数量的已配置条目(size()== 100),但在分析时,我发现内存中有~100K ConcurrentLinkedQueue $ Node对象。 这似乎是设计上的,只是浏览了ConcurrentLinkedQueue的源代码,删除只删除对存储对象的引用,但留下链接列表进行迭代。 最后我的问题是:是否有一种“更好”的懒惰方式来处理这种性质的集合? 我喜欢ConcurrentLinkedQueue的速度,我无法承受在这种情况下似乎可能出现的无界泄漏。 如果没有,似乎我必须创建第二个结构来跟踪订单,可能有相同的问题,加上同步问题。

Apache Kafka – 关于主题/分区的KafkaStream

我正在为高容量高速分布式应用编写Kafka Consumer。 我只有一个主题,但传入消息的速率非常高。 拥有多个服务于更多消费者的分区将适用于此用例。 最好的消费方式是拥有多个流阅读器。 根据文档或可用示例,ConsumerConnector提供的KafkaStream数量基于主题数量。 想知道如何获得多个KafkaStream读取器[基于分区],以便我可以跨每个流跨越一个线程或从多个线程中的相同KafkaStream读取将从多个分区进行并发读取? 任何见解都非常感谢。