Questions tagged «concurrency»

在计算机科学中,并发是系统的属性,其中可以在重叠的时间段内执行多个计算。这些计算可以在同一芯片的多个内核上执行,也可以在同一处理器上抢占时间共享线程,或者在物理上分开的处理器上执行。

6
在Java中选择最佳的并发列表
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 我的线程池具有固定数量的线程。这些线程需要频繁地从共享列表中写入和读取。 那么,java.util.concurrent在这种情况下,包中的哪种数据结构(最好是一个列表,必须没有监视器)是最好的?
98 java  concurrency 

9
为什么我不是原子++?
为什么i++在Java中不是原子的? 为了更深入地了解Java,我尝试计算线程中的循环执行的频率。 所以我用了 private static int total = 0; 在主要班级。 我有两个线程。 线程1:打印 System.out.println("Hello from Thread 1!"); 线程2:打印 System.out.println("Hello from Thread 2!"); 我计算了线程1和线程2打印的行数,但是线程1的行+线程2的行数与打印出的行总数不匹配。 这是我的代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; public class Test { private static int total = 0; private static int countT1 = 0; private static int …


7
线程之间共享静态变量吗?
我的高级Java课堂上有关线程的老师说了一些我不确定的东西。 他指出,以下代码不一定会更新ready变量。据他介绍,这两个线程不一定共享静态变量,特别是在每个线程(主线程与ReaderThread)在其自己的处理器上运行并且因此不共享相同的寄存器/缓存/等和一个CPU的情况下。不会更新其他。 从本质上讲,他说有可能ready在主线程中进行更新,而不是在中进行更新ReaderThread,因此ReaderThread将无限循环。 他还声称该程序可以打印0或打印42。我了解如何42打印,但不是0。他提到将number变量设置为默认值时就是这种情况。 我认为也许不能保证在线程之间更新静态变量,但是这对Java来说很奇怪。使ready挥发物能纠正这个问题吗? 他显示了以下代码: public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread { public void run() { while (!ready) Thread.yield(); System.out.println(number); } } public static void main(String[] args) { new ReaderThread().start(); number = 42; ready = true; } …

6
如何使用ConcurrentLinkedQueue?
如何ConcurrentLinkedQueue在Java中使用? 使用此方法LinkedQueue,我是否需要担心队列中的并发性?还是只需要定义两种方法(一种方法是从列表中检索元素,另一种方法是将元素添加到列表中)? 注意:显然,这两种方法必须同步。对? 编辑:我想要做的是:我有一类(在Java中),其中一种方法可从队列中检索项目,而另一类具有一种方法可将项目添加至队列。从列表中添加和检索的项目是我自己类的对象。 另一个问题:我需要在remove方法中执行以下操作: while (queue.size() == 0){ wait(); queue.poll(); } 我只有一个消费者和一个生产者。
95 java  concurrency 

6
是否存在使用当前线程的ExecutorService?
我所追求的是一种兼容的方式来配置是否使用线程池。理想情况下,其余代码完全不会受到影响。我可以使用具有1个线程的线程池,但这不是我想要的。有任何想法吗? ExecutorService es = threads == 0 ? new CurrentThreadExecutor() : Executors.newThreadPoolExecutor(threads); // es.execute / es.submit / new ExecutorCompletionService(es) etc
94 java  concurrency 

3
如何知道红宝石不是线程安全的?
从Rails 4开始,默认情况下所有内容都必须在线程环境中运行。这意味着所有我们写的代码和 所有我们使用需要是宝石threadsafe 因此,我对此没有几个问题: 在ruby / rails中,什么不是线程安全的?VS什么是Ruby / Rails中的线程安全? 是否有宝石的列表被称为是线程安全的,反之亦然? 是否有不是线程安全示例的常见代码模式列表@result ||= some_method? ruby lang核心中的数据结构(例如Hashetc线程)是否安全? 在MRI上,一个GVL/GIL表示一次只能运行1条红宝石线程,除了IO,线程安全更改对我们有影响吗?

1
scala.concurrent.Promise的用例是什么?
我正在阅读SIP-14,其概念Future非常合理且易于理解。但是有两个问题Promise: SIP说Depending on the implementation, it may be the case that p.future == p。怎么会这样?是Future与Promise不是两种不同类型的? 我们Promise什么时候应该使用?示例producer and consumer代码: import scala.concurrent.{ future, promise } val p = promise[T] val f = p.future val producer = future { val r = produceSomething() p success r continueDoingSomethingUnrelated() } val consumer = future { startDoingSomething() …

9
ExecutorService在超时后中断任务
我正在寻找可以提供超时的ExecutorService实现。如果提交给ExecutorService的任务花费的时间超过了超时时间,则这些任务将被中断。实现这样的野兽并不是一个困难的任务,但是我想知道是否有人知道现有的实现。 这是我根据以下一些讨论得出的。任何意见? import java.util.List; import java.util.concurrent.*; public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) …

8
函数语言(特别是Erlang)如何/为什么很好地缩放?
一段时间以来,我一直在关注功能编程语言和功能的日益普及。我调查了他们,却没有看到上诉的原因。 然后,最近我在Codemash上参加了Kevin Smith的“ Erlang基础”演讲。 我享受了演示,并了解到函数式编程的许多属性使避免线程/并发问题变得更加容易。我知道状态和可变性的缺乏使多个线程无法更改同一数据,但是Kevin表示(如果我理解正确的话),所有通信都是通过消息进行的,消息是同步处理的(再次避免了并发问题)。 但是我读过Erlang用于高度可扩展的应用程序(这是爱立信首先创建它的全部原因)。如果将所有内容都作为同步处理的消息来处理,那么如何高效地每秒处理数千个请求?这不是为什么我们开始转向异步处理-这样我们才能利用同时运行多个操作线程并实现可伸缩性的优势吗?看起来这种体系结构虽然更安全,但在可伸缩性方面却倒退了一步。我想念什么? 我了解Erlang的创建者有意避免支持线程以避免并发问题,但是我认为多线程是实现可伸缩性所必需的。 函数式编程语言如何才能固有地具有线程安全性,又可以扩展?

6
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 …

7
信号量-初始计数有什么用?
http://msdn.microsoft.com/zh-CN/library/system.threading.semaphoreslim.aspx 要创建信号灯,我需要提供一个初始计数和最大计数。MSDN指出,初始计数为- 可以同时授予的信号量请求的初始数量。 虽然它指出最大数量是 可以同时授予的信号量请求的最大数量。 我可以理解,最大数量是可以同时访问资源的最大线程数。但是,初始计数的用途是什么? 如果我创建的信号量的初始计数为0,最大计数为2,则我的线程池线程都无法访问该资源。如果将初始计数设置为1,最大计数设置为2,则只有线程池线程可以访问资源。仅当我将初始计数和最大计数都设置为2时,两个线程才能够同时访问资源。那么,我真的对初始计数的重要性感到困惑吗? SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at a time SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2, 2);//two threadpool threads can access the resource concurrently

9
同步访问SimpleDateFormat
SimpleDateFormat的Javadoc指出SimpleDateFormat没有同步。 “日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一种格式,则必须在外部进行同步。” 但是,在多线程环境中使用SimpleDateFormat实例的最佳方法是什么。这是我想到的一些选项,我过去曾使用过选项1和2,但是我很想知道是否有更好的选择,或者这些选项中的哪一个可以提供最佳的性能和并发性。 选项1:在需要时创建本地实例 public String formatDate(Date d) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(d); } 选项2:将SimpleDateFormat的实例创建为类变量,但同步对其的访问。 private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public String formatDate(Date d) { synchronized(sdf) { return sdf.format(d); } } 选项3:创建一个ThreadLocal来为每个线程存储一个不同的SimpleDateFormat实例。 private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>(); public String formatDate(Date d) { SimpleDateFormat sdf = …

10
是否有多个进程共享侦听套接字的方法?
在套接字编程中,您将创建一个侦听套接字,然后为每个连接的客户端获得一个正常的流套接字,可用于处理客户端的请求。操作系统管理后台的传入连接队列。 默认情况下,两个进程不能同时绑定到同一端口。 我想知道是否有一种方法(在任何知名的OS上,尤其是Windows上)启动一个进程的多个实例,以使它们全部绑定到套接字,从而有效地共享队列。每个流程实例可以是单线程的;接受新的连接时它将阻塞。当客户端连接时,一个空闲的流程实例将接受该客户端。 这将允许每个进程具有非常简单的单线程实现,除非通过显式共享内存,否则不共享任何内容,并且用户将能够通过启动更多实例来调整处理带宽。 是否存在这样的功能? 编辑:对于那些问“为什么不使用线程?”的人 显然,线程是一个选择。但是在单个进程中有多个线程的情况下,所有对象都是可共享的,因此必须格外小心,以确保对象不是共享的,或者一次仅对一个线程可见,或者是绝对不变的,并且大多数流行的语言和运行时缺少用于管理这种复杂性的内置支持。 通过启动几个相同的工作进程,您将获得一个并发系统,其中的默认设置为不共享,从而使构建正确且可扩展的实现变得更加容易。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.