Tag: 并发

锁,互斥体,信号量…有什么区别?

我听说过这些与并发编程相关的词,但它们之间有什么不同呢?

为什么没有针对ConcurrentHashMap的ConcurrentHashSet

HashSet基于HashMap。 如果我们看一下HashSet<E>实现,所有东西都在HashMap<E,Object>之下进行pipe理。 <E>被用作HashMap的关键字。 而且我们知道HashMap不是线程安全的。 这就是为什么我们有Java中的ConcurrentHashMap 。 基于此,我很困惑, 为什么我们没有一个ConcurrentHashSet应该基于ConcurrentHashMap ? 还有什么我失踪? 我需要在multithreading环境中使用Set 。 另外,如果我想创build我自己的ConcurrentHashSet ,我可以通过将HashMapreplace为ConcurrentHashMap并将其余部分保持原样来实现它?

Python urllib2.urlopen()很慢,需要更好的方法来阅读几个url

正如标题所示,我正在使用python编写的网站上工作,并且会多次调用urllib2模块来读取网站。 然后我用BeautifulSoupparsing它们。 由于我必须阅读5-10个网站,页面需要一段时间才能加载。 我只是想知道是否有办法一次读取所有的网站? 或任何使它更快,就像我应该在每次阅读后closuresurllib2.urlopen,或保持打开? 另外,如果我只是切换到PHP,那么从其他网站获取和Parsi HTML和XML文件会更快? 我只是希望它加载更快,而不是目前所需的〜20秒

列出<未来>到未来<列表>序列

我正在尝试将List<CompletableFuture<X>>转换为CompletableFuture<List<T>> 。 这是非常有用的,因为当你有很多的asynchronous任务,你需要得到所有的结果。 如果其中任何一个失败,那么最后的未来将失败。 这是我已经实现的: public static <T> CompletableFuture<List<T>> sequence2(List<CompletableFuture<T>> com, ExecutorService exec) { if(com.isEmpty()){ throw new IllegalArgumentException(); } Stream<? extends CompletableFuture<T>> stream = com.stream(); CompletableFuture<List<T>> init = CompletableFuture.completedFuture(new ArrayList<T>()); return stream.reduce(init, (ls, fut) -> ls.thenComposeAsync(x -> fut.thenApplyAsync(y -> { x.add(y); return x; },exec),exec), (a, b) -> a.thenCombineAsync(b,(ls1,ls2)-> { ls1.addAll(ls2); return ls1; },exec)); } 运行它: […]

如何在Java中调用一些阻塞方法?

有没有一个标准的很好的方式来调用一个阻塞方法在Java中超时? 我想能够做到: // call something.blockingMethod(); // if it hasn't come back within 2 seconds, forget it 如果这是有道理的。 谢谢。

Java ReentrantReadWriteLocks – 如何安全地获取写locking?

我现在在我的代码中使用ReentrantReadWriteLock来同步树状结构的访问。 这个结构很大,可以一次读取多个线程,偶尔修改一小部分,所以它似乎很适合读写的习惯用法。 我明白,在这个特定的类中,不能提高对写入锁的读取locking,因此每个Javadoc必须在获得写入locking之前释放读取locking。 我以前在非重入的上下文中成功地使用了这个模式。 然而,我发现我无法可靠地获得永久封锁的写入locking。 由于读锁是可重入的,我实际上是这样使用简单的代码 lock.getReadLock().unlock(); lock.getWriteLock().lock() 可以阻止,如果我已经获得了readlock reentntly。 每次解锁的呼叫都会减less保持计数,并且只有当保持计数达到零时locking才被释放。 编辑澄清这一点,因为我不认为我最初解释得太好 – 我知道这个类没有内置的锁升级,我不得不简单地释放读锁,并获得写锁。 我的问题是/不pipe其他线程在做什么,调用getReadLock().unlock()可能实际上并不释放这个线程的锁,如果它获得了reentrantly,在这种情况下调用getWriteLock().lock()会永久阻塞,因为这个线程仍然持有读锁,从而阻塞自己。 例如,即使在没有其他线程访问锁的情况下运行singlethreaded,该代码片段也将永远不会到达println语句: final ReadWriteLock lock = new ReentrantReadWriteLock(); lock.getReadLock().lock(); // In real code we would go call other methods that end up calling back and // thus locking again lock.getReadLock().lock(); // Now we do some stuff and realise we need to […]

Java中不同types的线程安全集

Java中似乎有很多不同的实现和方法来生成线程安全的集合。 一些例子包括 1) CopyOnWriteArraySet 2) Collections.synchronizedSet(Set集) 3) ConcurrentSkipListSet 4) Collections.newSetFromMap(new ConcurrentHashMap()) 5)以类似于(4)的方式生成的其他集合 这些示例来自并发模式:Java 6中的并发集实现 有人可以简单地解释一下这些例子和其他例子的差异,优点和缺点吗? 我无法理解并保持Java Std Docs中的所有内容。

Java并发:CAS与locking

我正在阅读Java实践书籍并发 。 在第15章中,他们正在讨论非阻塞algorithm和比较与交换 (CAS)方法。 据说CAS比locking方法好得多。 我想询问那些已经同时使用这两个概念的人,并且希望听到你更喜欢哪一个概念? 它真的太快了吗? 对我来说,锁的使用更清晰,更容易理解,甚至更好维护(如果我错了,请纠正我) 。 我们是否真的应该专注于创build与CAS相关的并发代码而不是锁,以获得更好的性能提升,还是可持续性更重要? 我知道有什么时候使用什么可能没有严格的规定。 但是我想听听一些关于CAS新概念的意见和经验。

强制多个线程在可用时使用多个CPU

我正在写一个Java程序,它使用了很多的CPU,因为它的性质。 但是,它可以并行运行,而且我的程序是multithreading的。 当我运行它,似乎只使用一个CPU,直到它需要更多,然后使用另一个CPU – 有什么我可以在Java中做强迫不同的线程运行在不同的核心/ CPU?

CountDownLatch与信号量

有没有使用的好处 java.util.concurrent.CountdownLatch 代替 java.util.concurrent.Semaphore ? 据我所知,以下片段几乎是等价的: 1.信号量 final Semaphore sem = new Semaphore(0); for (int i = 0; i < num_threads; ++ i) { Thread t = new Thread() { public void run() { try { doStuff(); } finally { sem.release(); } } }; t.start(); } sem.acquire(num_threads); 2:CountDownLatch final CountDownLatch latch = new CountDownLatch(num_threads); for […]