Re: Помогите с многопоточным кодом
От: · Великобритания  
Дата: 05.09.22 18:00
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Функция должна возвращать два значения: long x, int y. x это текущее время в миллисекундах. y это случайное число. Если вызывать функцию два раза подряд, то должно соблюдаться условие (x1, y1) < (x2, y2). Это, конечно, очевидно, если вызовы идут из одного потока. Если из двух потоков, то нужно, чтобы это условие сочеталось со стандартным java happens before (т.е. если потоки никак не связаны друг с другом, то как получится, если есть какие-то синхронизации между потоками, то должно условие соблюдаться). Ну и понятно, что оно должно работать как можно быстрей.


vsb>Я написал 3 версии функции. Первая очевидно правильная, но через sychronized, что слишком сильно для данных требований. Вторая и третья через volatile и atomic соответственно. Хочется понять, правильно ли я их написал и какой вариант лучше.

В третьей я вроде не обнаружил проблему, вроде эквивалентно первой.
Во второй что-то подозрительно

// lastVolatileX = 99, lastVolatileY=5
 while (true) {
            int y = random.nextInt(); // thread1.y=10, thread2.y=5
            long x = System.currentTimeMillis(); //thread1.x=99, thread2.x = 100
            if (x > lastVolatileX || y > lastVolatileY) {// x > lastVolatileX == true in thread2  || y > lastVolatileY == true in thread1
                lastVolatileX = x;//race
                lastVolatileY = y;//race
                return new Pair(x, y);//thread1 returns (99, 10), thread2 returns (100, 5)
            }
        }
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 05.09.2022 18:01 · . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.