Tag: 并发

需要一个可以支持多个读者的队列

我需要一个可以由多个读者处理的队列。 读者将一个元素出列并将其发送到REST服务。 重要的是要注意: 每个读者都应该出列不同的元素。 如果队列具有元素A,B和C,则线程1应该出列A并且线程2应该以并发方式出列B. 等等,直到队列中没有任何内容。 我知道总是在繁忙的循环中运行,窥视项目的队列是CPU密集型的。 所以我不确定阻塞队列是不是一个好选择。 我有什么选择?

满足高并发性时的简单Web服务器

这不是作业,而是我在网上找到的面试问题。 java代码是: public class SimpleWebServer{ public static void handleRequest(Socket c) { //Process the request } public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(80); while(true) { final Socket connection=server.accept(); Runnable task=new Runnable(){ @Override public void run() { handleRequest(connection); } }; new Thread(task).start(); } } } 问题是当并发性很高时会出现什么样的潜在问题? 我的分析是: 它没有使用synchronized关键字,因此可能会出现竞争条件。 它应该使用更高效的线程池。 对于每个传入的线程,类似乎总是创建一个新的ServerSocket,当高并发发生时会占用大量空间?

Java的Timer任务是否保证不会同时运行?

new Timer(…).schedule(task) task保证在任何给定时间由单个线程运行吗?

Thread.sleep()如何在内部工作

假设我有一个线程T并且它持有一个资源R.如果我在当前线程上调用Thread.sleep()即T,它会在进入睡眠之前释放资源R(让其他线程使用它) ? 或者它将保留该资源,并且当它将唤醒时它将使用资源R并且在完成工作后它将释放它吗?

在并发程序中从BlockingQueue获取对象的最佳方法?

在没有遇到竞争条件的情况下,在并发程序中从BlockingQueue中获取对象的最佳方法是什么? 我目前正在做以下事情,我不相信这是最好的方法: BlockingQueue vQueue; /* in the constructor I pass in a BlockingQueue object full of violations that need to be processed – cut out for brevity */ Violation v; while ( ( v = vQueue.poll(500, TimeUnit.MILLISECONDS) ) != null ) { // do stuff with the violation } 我还没有达到竞争状态……但是,我不确定这是否真的安全。

在multithreading中找到死锁的原因?

multithreading应用程序冻结。 也许是因为僵局造成的。 如果是,那么我们如何找到死锁的原因? 系统地执行此操作的任何工具和策略?

如何分配给局部变量在这里有帮助?

我正在阅读Effective Java双重检查锁定。 代码执行以下操作: private volatile FieldType field; FieldType getField() { FieldType result = field; if (result == null) { // First check (no locking) synchronized(this) { result = field; if (result == null) // Second check (with locking) field = result = computeFieldValue(); } } return result; } 它表示使用result似乎不需要,但实际上确保该field仅在已经初始化的常见情况下只读取一次。 但我不明白这一点。 直接做if(field == null)有什么区别? 我不明白为什么if (result […]

构建后可见的Java非final int

我有一个带有非final int变量的java类,我在构造函数中将其显式初始化为0.对该变量的所有其他访问都由ReentrantLock管理。 我是否必须担心线程不会看到0的初始值,因为我没有在构造函数中使用锁?

异步迭代器

我有以下代码: while(slowIterator.hasNext()) { performLengthTask(slowIterator.next()); } 因为迭代器和任务都很慢,所以将它们放入单独的线程中是有意义的。 以下是Iterator包装器的快速而脏的尝试: class AsyncIterator implements Iterator { private final BlockingQueue queue = new ArrayBlockingQueue(100); private AsyncIterator(final Iterator delegate) { new Thread() { @Override public void run() { while(delegate.hasNext()) { queue.put(delegate.next()); // try/catch removed for brevity } } }.start(); } @Override public boolean hasNext() { return true; } @Override public T […]

在Java中,如何在单线程程序中抛出ConcurrentModificationException?

我正在阅读这个“ Freuqent Java并发问题 ”的问题,并且在谈论java.util.ConcurrentModificationException的答案时感到困惑。 我对答案的理解是,这可能发生在单线程程序中。 如何或什么条件导致以下代码抛出exception? List list = new ArrayList(Arrays.asList(“a”, “b”, “c”)); for (String string : list) { list.remove(string); }