Tag: 并发

信号量 – 初始计数有什么用?

http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx 要创build一个信号量,我需要提供一个初始计数和最大计数。 MSDN指出,最初的计数是 – 可以同时授予的信号量请求的初始数量。 虽然它说最大的数量是 可以同时授予的信号量的最大请求数。 我可以理解,最大数量是可以并发访问资源的最大线程数。 但是,什么是初始计数的使用? 如果我创build一个初始计数为0和最大计数为2的信号量,则不会有任何线程池线程能够访问资源。 如果我将初始计数设置为1,最大计数设置为2,则只有线程池线程可以访问资源。 只有当初始计数和最大计数都设置为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

GCD的“全球队列”和“主队列”有什么区别?

在其他一些方法中,有两种方法可以在GCD获得队列: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_get_main_queue(); 如果我没有完全错误,主要的线程正在执行“主队列”,并且对于执行UI工作的“callback”块是有用的。 这是否意味着“全局队列”是在后台线程上运行的?

有没有使用一个易变的长期?

我偶尔使用一个volatilevariables来处理两个线程读取/写入的情况,而不希望取出锁的开销(或潜在的死锁风险)。 例如一个定时器线程定期更新一个inttypes的ID,这个ID在某些类上被作为getter使用: public class MyClass { private volatile int id; public MyClass() { ScheduledExecutorService execService = Executors.newScheduledThreadPool(1); execService.scheduleAtFixedRate(new Runnable() { public void run() { ++id; } }, 0L, 30L, TimeUnit.SECONDS); } public int getId() { return id; } } 我的问题:鉴于JLS只保证32位读取将是primefaces是有没有使用一个易变的长期的任何一点? (即64位)。 警告 :请不要回复说,使用volatile over synchronized是一种预优化的情况; 我很清楚如何/何时使用synchronized但有些情况下volatile是最好的。 例如,当定义一个在单线程应用程序中使用的Spring bean时,我倾向于支持volatilevariables,因为不能保证Spring上下文将初始化主线程中的每个bean的属性。

ExecutorService中的活动线程

任何想法如何确定在ExecutorService中运行的活动线程的数量?

什么时候应该使用Java的Thread over Executor?

执行者似乎是一个干净的抽象。 你想什么时候直接使用Thread而不是依赖更强大的执行器?

如何使用固定数量的工作线程来实现简单线程

我正在寻找最简单,最直接的方法来实现以下内容: 主程序实例化工作线程来完成一项任务。 只有n任务可以同时运行。 当达到n时,不再有工人开始工作,直到正在运行的线程的数量回落到n以下。

如何使BackgroundWorker返回一个对象

我需要使RunWorkerAsync()返回一个List<FileInfo> 。 我怎样才能从一个后台工作人员返回一个对象?

在Java中编程死锁检测

如何以编程方式检测Java程序中是否发生了死锁?

DateTime可以在64位环境中破解吗?

在C#中,只要一个variables的值最多为native int (即在32位运行时环境中为4个字节,在64位中为8个字节), native int其设置为primefaces。 在包含所有引用types和大多数内置值types( byte , short , int , long等)的64位环境中。 设置一个更大的值不是primefaces的,只会更新内存的一部分,会造成撕裂。 DateTime是一个只包含一个包含其所有数据( Ticks和DateTimeKind )的ulong字段的结构, ulong本身在64位环境中是primefaces的。 这是否意味着DateTime也是primefaces的? 或者下面的代码是否会导致在某个点上撕裂? static DateTime _value; static void Main() { for (int i = 0; i < 10; i++) { new Thread(_ => { var random = new Random(); while (true) { _value = new DateTime((long)random.Next() << 30 […]

分布式并发控制

我已经在这个工作了几天,我已经find了几个解决scheme,但没有一个是令人难以置信的简单或轻量级。 问题基本上是这样的:我们有10台机器的集群,每台机器都在multithreadingESB平台上运行相同的软件。 我可以很容易地处理同一台机器上的线程之间的并发问题,但是对于不同机器上相同数据的并发性呢? 本质上,软件接收请求,通过Web服务将客户的数据从一个业务提供给另一个业务。 但是,客户可能会或可能不会在另一个系统上存在。 如果没有,我们通过Web服务方法创build它。 所以它需要一种testing和设置,但是我需要某种信号量来locking其他机器导致竞争状态。 在一个本地客户创build了两次远程客户之前,我已经遇到过这种情况,这并不是真正需要的。 我在概念上玩弄的解决scheme是: 使用我们的容错共享文件系统创build“locking”文件,这将由每台机器根据客户检查 在我们的数据库中使用一个特殊的表,并locking整个表,以便为锁logging做一个“testing和设置”。 使用Terracotta,这是一个开源服务器软件,可以协助扩展,但是使用了hub-and-spoke模式。 使用EHCache同步复制我的内存“锁”。 我无法想象我是唯一一个遇到这种问题的人。 你是怎么解决的? 你有没有在内部做点什么,或者你有一个最喜欢的第三方产品?