Tag: 并发

写一个肯定会陷入僵局的程序

我最近在采访中得到了这个问题。 我回答说,如果交错发生,就会发生死锁,但是采访者坚持认为,一个程序总是会陷入僵局,而不pipe交错如何。 我们可以写这样的程序吗? 你能指点我一些这样的例子程序?

如何使用ConcurrentLinkedQueue?

如何在Java中使用ConcurrentLinkedQueue ? 使用这个LinkedQueue ,我需要担心队列中的并发吗? 或者我只需要定义两个方法(一个从列表中检索元素,另一个向列表中添加元素)? 注意:显然这两个方法必须同步。 对? 编辑:我想要做的是这样的:我有一个类(在Java中)与一种方法来检索项目从队列和另一个类用一种方法添加项目到队列。 从列表中添加和检索的项目是我自己class级的对象。 还有一个问题:我需要在删除方法中执行此操作: while (queue.size() == 0){ wait(); queue.poll(); } 我只有一个消费者和一个生产者。

不可能做一个大小限制的caching线程池?

看起来不可能创build一个caching的线程池,它可以创build一个线程数量的限制。 下面是在标准Java库中实现的静态Executors.newCachedThreadPool: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } 所以,使用该模板继续创build一个固定大小的caching线程池: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); 现在,如果你使用这个,并提交3个任务,一切都会好的。 提交任何进一步的任务将导致被拒绝的执行exception。 尝试这个: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); 将导致所有线程顺序执行。 也就是说,线程池将永远不会使多个线程来处理您的任务。 这是ThreadPoolExecutor的执行方法中的一个错误? 或者也许这是故意的? 或者有其他的方法? 编辑:我想要的东西就像caching线程池(它创build线程按需,然后在一定的时间后杀死它们),但它可以创build的线程数量的限制,并能够继续排队附加任务打到它的线程限制。 根据sjlee的回答,这是不可能的。 看看ThreadPoolExecutor的execute()方法确实是不可能的。 我需要inheritanceThreadPoolExecutor并像SwingWorker那样重写exe​​cute(),但是SwingWorker在其execute()方法中做了什么是一个彻底的破解。

LMAX的干扰模式如何工作?

我正试图了解干扰模式 。 我观看了InfoQ的video并试图阅读他们的论文。 我知道有一个环形缓冲区涉及,它被初始化为一个非常大的数组,以利用caching局部性,消除新内存的分配。 这听起来像是有一个或多个primefaces整数跟踪位置。 每个“事件”似乎都得到了一个唯一的ID,并且它的环中的位置是通过相对于环的大小等来查找其模数而find的。 不幸的是,我并没有直观的感觉。 我做了很多交易应用,研究了演员模型 ,看了SEDA等。 他们在介绍中提到,这种模式基本上是路由器如何工作的; 但是我还没有find路由器如何工作的任何好的描述。 有没有更好的解释指针?

MySQL INSERT IF(自定义if语句)

首先,下面是问题的简要总结: 是否有可能有条件地运行INSERT语句? 类似这样的东西: IF(expression) INSERT… 现在,我知道我可以用存储过程来做到这一点。 我的问题是:我可以在我的查询中做到这一点? 现在,我为什么要这样做呢? 假设我们有以下两个表格: products: id, qty_on_hand orders: id, product_id, qty 现在,让我们来说20个巫毒娃娃(产品编号2)的订单进来。 我们首先检查手头是否有足够的数量: SELECT IF( ( SELECT SUM(qty) FROM orders WHERE product_id = 2 ) + 20 <= ( SELECT qty_on_hand FROM products WHERE id = 2) , 'true', 'false'); 然后,如果它评估为真,我们运行一个INSERT查询。 到现在为止还挺好。 但是,并发性有问题。 如果两个订单在同一时间进入,他们可能都会在其中任何一个订单进入之前阅读手头数量。 然后他们会下订单,从而超过qty_on_hand 。 所以,回到问题的根源: 是否可以有条件地运行INSERT语句,以便我们可以将这两个查询合并为一个? 我search了很多,我能find的唯一一种条件INSERT语句是ON DUPLICATE […]

Bash:限制并发作业的数量?

有没有简单的方法来限制bash中的并发作业数量? 我的意思是当在后台运行n个以上的并发作业时,使得&阻塞。 我知道我可以用ps |来实现这个 grep式的技巧,但有没有更简单的方法?

什么是“不完整的对象”?

Goetz的“ Java并发实践 ”第41页提到了this参考在构build过程中如何逃脱。 一个“不要这样做”的例子: public class ThisEscape { public ThisEscape(EventSource source) { source.registerListener( new EventListener() { public void onEvent(Event e) { doSomething(e); } }); } } this是通过doSomething(e)引用封闭的ThisEscape实例的事实“逃避”的。 情况可以通过使用静态工厂方法(首先构造普通对象,然后注册侦听器)而不是公共构造函数(完成所有工作)来解决。 这本书继续: 从其构造函数中发布一个对象可以发布一个不完整构造的对象。 即使发布是构造函数中的最后一个语句,也是如此。 如果this参考文件在施工过程中逃脱了,那么该对象被认为没有正确的构造。 我不太明白 如果出版物是构造函数中的最后一个声明,那么在此之前并没有完成所有的构build工作? 那么这到底是不是有效? 显然有一些巫术之后,但什么?

生产者 – 消费者在超级同胞与非超级同胞之间共享内存位置的延迟和吞吐成本是多less?

单个进程中的两个不同的线程可以通过读取和/或写入共享一个共同的内存位置。 通常,这种(有意的)共享是通过使用x86上的lock前缀的primefaces操作来实现的,这对于lock前缀本身(即,无争议的成本)具有相当公知的成本,并且当高速caching行实际上具有额外的一致性成本共享 (真实或虚假分享)。 在这里,我感兴趣的是单线程P写入内存位置的产生消费者成本,另一个线程`C从内存位置读取,都使用普通读写。 在同一个套接字的不同内核上执行这种操作时的延迟和吞吐量是多less,而在最近的x86内核上的同一个物理内核上的同级超线程上执行时,则是​​如此。 在标题中,我使用的术语“超级同胞”是指在同一个内核的两个逻辑线程上运行的两个线程,而内核之间的同级是指在不同的物理内核上运行的两个线程的更常见的情况。

你会解释locking顺序吗?

我了解到,我应该解锁相反的顺序来locking订单。 例如。 A.lock(); B.lock(); B.unlock(); A.unlock(); 但是,如果我这样做会发生什么: A.lock(); B.lock(); A.unlock(); B.unlock(); 我试图做一个死锁的情况,但如果我总是先lockingA然后B,那么我不知道会发生什么样的死锁。 你能帮我吗?

日志输出的多进程。进程

在python中使用multiprocessing.Process类时,是否有办法logging给定Process的stdout输出?