Tag: multithreading

引用赋值是primefaces,所以为什么Interlocked.Exchange(ref Object,Object)需要?

在我的multithreadingasmx Web服务中,我有一个我自己types的SystemData的类字段_allData,它由less数List<T>和Dictionary<T>标记为volatile 。 系统数据( _allData )刷新一次,我通过创build另一个名为newData对象,并用新的数据填充它的数据结构。 完成后,我只是分配 private static volatile SystemData _allData public static bool LoadAllSystemData() { SystemData newData = new SystemData(); /* fill newData with up-to-date data*/ … _allData = newData. } 这应该工作,因为赋值是primefaces的,并且对旧数据的引用的线程继续使用它,其余的在赋值之后有新的系统数据。 然而,我的同事说,而不是使用volatile关键字和简单的assigment,我应该使用InterLocked.Exchange因为他说,在某些平台上,不能保证参考分配是primefaces。 而且:当我声明the _allData字段为volatile Interlocked.Exchange<SystemData>(ref _allData, newData); 产生警告“对易失性字段的引用不会被视为易失性”我应该怎么看待这个问题?

C#线程终止和Thread.Abort()

在MSDN中,Thread.Abort()方法的描述表示:“调用此方法通常会终止该线程。 为什么不总是? 在哪种情况下,它不会终止线程? 有没有其他的可能性来终止线程?

Java静态初始化器是否线程安全?

我正在使用静态代码块来初始化我在registry中的一些控制器。 所以我的问题是,我可以保证,这个静态代码块将只会被绝对调用一次,当第一次加载类? 我知道我不能保证什么时候这个代码块将被调用,我猜它是什么时候Classloader第一次加载它。 我意识到我可以在静态代码块的类上同步,但我的猜测是这实际上是什么发生呢? 简单的代码示例是; class FooRegistry { static { //this code must only ever be called once addController(new FooControllerImpl()); } private static void addController(IFooController controller) { // … } } 或者我应该这样做; class FooRegistry { static { synchronized(FooRegistry.class) { addController(new FooControllerImpl()); } } private static void addController(IFooController controller) { // … } }

如何在Java中运行不同类实例的线程之间同步静态variables?

我知道在一个方法为该对象带来同步之前使用synchronize关键字。 也就是说,运行同一个对象实例的2个线程将被同步。 但是,由于同步处于对象级别,因此运行不同对象实例的2个线程将不会同步。 所以,如果我们在方法调用的java类中有一个静态variables,我们希望它在类的实例间同步。 这两个实例在两个不同的线程中运行。 我们可以通过以下方式实现同​​步吗? 公共类testing { private static int count = 0; private static final Object lock = new Object(); public synchronized void foo() { 同步(locking) { 计数++; } } } 是否真的,因为我们已经定义了一个静态的对象“锁”,并且我们正在使用该锁的关键字synchronized,所以静态varibale计数现在可以在类Test的实例间同步了?

selectExecutorService的提交和ExecutorService的执行

如果返回的值不是我所关心的,我应该如何selectExecutorService的 提交还是执行 ? 如果我testing两者,除了返回值之外,我没有看到两者之间的差异。 ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.execute(new Task()); ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); threadExecutor.submit(new Task());

互斥示例/教程?

我是新来的multithreading,并试图了解互斥体如何工作。 有很多谷歌search, 我find了一个体面的教程 ,但它仍然留下了一些工作,因为我创build了自己的程序,其中locking不起作用的怀疑。 一个绝对不直观的互斥语法是pthread_mutex_lock( &mutex1 ); ,它看起来像互斥体被locking,当我真正想locking的是其他一些variables。 这个语法是否意味着locking一个互斥锁,locking一段代码,直到互斥锁被解锁? 那么线程怎么知道这个区域被locking? [ 更新:线程通过 内存屏蔽 知道该区域被locking ]。 而不是这样的现象应该被称为临界区? [ 更新:临界区对象仅在Windows中可用,其中对象比互斥体快,只有实现它的线程才可见。 否则,关键部分只是指由互斥体保护的代码区域 ] 简而言之,能否请您介绍一下最简单的互斥示例程序以及关于它如何工作的逻辑的最简单可能的解释 ? 我相信这会帮助其他许多新手。

如何用c ++ 11 CAS实现ABA计数器?

我正在实现基于此algorithm的无锁队列,该algorithm使用计数器来解决ABA问题。 但是我不知道如何用c ++ 11 CAS来实现这个计数器。 例如,从algorithm: E9: if CAS(&tail.ptr->next, next, <node, next.count+1>) 这是一个primefaces操作,意思是如果tail.ptr->next等于next ,则让tail.ptr->next指向node , 同时(primefaces地)使next.count+1 。 但是,使用C ++ 11 CAS,我只能实现: std::atomic_compare_exchange_weak(&tail.ptr->next, next, node); 不能使next.count+1同时发生。

Eratosthenes素数比同时更快?

我目前正在编写一个程序,首先依次由Eratosthenes Sieve生成素数,然后同时进行。 该algorithm的并发版本应该比顺序版本更快,但在我的情况下,并发版本是约。 慢了10倍 我想知道我在哪里把额外的工作放在我的线程上,而不是顺序解决scheme中的主线程。 这是我的程序(准备阅读一下!): Primes.java : public abstract class Primes { byte[] bitArr; int maxNum; final int[] BITMASK = { 1, 2, 4, 8, 16, 32, 64 }; final int[] BITMASK2 = { 255 – 1, 255 – 2, 255 – 4, 255 – 8, 255 – 16, 255 – 32, 255 – […]

Java中的SwingWorker

我有个问题。 我有一个JFrame 。 它会创build一个JDialog 。 当按下JDialog上的button时,它应该被丢弃,并发送一封电子邮件。 同时,我需要另一个JDialog以确定的JProgressBar出现。 当发送电子邮件时, JDialog应该被丢弃(并且新build一个)或者它的内容应该改变。 现在我已经失败了好几个小时了,所以我现在要问的是,如果他(她)能够给我写一个可以做我想做的伪代码的话。 只要看看SwingWorker类中应该包含什么(或者如果你认为它更好,可以使用multithreading),当创build/处理JDialog时,以及在哪里发送邮件… 我知道我在这里要求一个完成的解决scheme,但我已经在一个专业上,已经失败了很多次了…这是我的最后一招…

C#数组是否线程安全?

尤其是 创build一个函数来获取一个数组和一个索引作为参数。 创build一个元素数组。 创build一个计数循环。 在新线程的循环内部,使用传入的索引器将对象的新实例分配给数组。 我知道如何pipe理线程等。我有兴趣知道这是否是线程安全的做某事。 class Program { // bogus object class SomeObject { private int value1; private int value2; public SomeObject(int value1, int value2) { this.value1 = value1; this.value2 = value2; } } static void Main(string[] args) { var s = new SomeObject[10]; var threads = Environment.ProcessorCount – 1; var stp = new […]