Проблемы параллелизма с произвольным доступом в .Net?

Я отладил некоторую проблему с плагином Paint.Net , и я наткнулся на некоторую проблему с классом Random, когда несколько потоков вызывают метод из единственный экземпляр.

По какой-то странной причине кажется, что если я не предотвращу параллельный доступ, синхронизируя вызываемый метод, мой экземпляр Random начинает вести себя ... случайным образом (но в плохом смысле).

В следующем примере я создаю несколько сотен потоков, которые постоянно вызывают один объект Random. И когда я запускаю его, я иногда (не всегда, но почти) получаю явно неверные результаты. Проблема НИКОГДА не возникает, если я раскомментирую аннотацию метода Synchronized .

using System;
using System.Threading;
using System.Runtime.CompilerServices;
namespace testRandom {

    class RandTest  {
        static int NTIMES = 300;

        private long ac=0;

        public void run() { // ask for random number 'ntimes' and accumulate
            for(int i=0;i

Пример вывода (с указанными выше значениями):

Average: 78.98   Expected:128.00
Press any key to continue . . .

Это известная проблема? Неправильно ли вызывать объект Random из нескольких потоков без синхронизации?

ОБНОВЛЕНИЕ: Согласно ответам, в документации указано, что методы Random не являются потокобезопасными - mea culpa, я должен был это прочитать. Возможно, я читал это раньше, но не считал это таким важным - можно (небрежно) подумать, что в редких случаях, когда два потока одновременно вводят один и тот же метод, худшее, что может случиться, это то, что эти вызовы дают неправильные результаты, а не огромное дело, если мы не слишком озабочены качеством случайных чисел ... Но проблема действительно катастрофическая, потому что объект остается в несогласованном состоянии, и после этого возвращается, продолжает возвращать ноль - как отмечено здесь .

6
задан leonbloy 6 May 2011 в 18:45
поделиться