Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Атомарность??

512
18 июня 2011 года
bnm
124 / / 17.10.2004
Подскажите, что значит атомарная - операция?
5
18 июня 2011 года
hardcase
4.5K / / 09.08.2005
Атомарность
512
18 июня 2011 года
bnm
124 / / 17.10.2004
я правильно понимаю что в жаве, атомарна, только операция присваивания(=)? Ну имеется в виду среди тех операций которые влекут изменение операнда..
14
20 июня 2011 года
Phodopus
3.3K / / 19.06.2008
Судя по спецификации JVM операции load/store/read/write над double или long в общем случае не атомарны.
276
20 июня 2011 года
Rebbit
1.1K / / 01.08.2005
1. Почитайте про слово volatile

2. Почитайте статью http://www.javenue.info/post/81 и поймите что volatile не панацея и не может заменить собой синхронизацию

3. Чтобы всетаки понять зачем нужно volatile поекспериментируйте с моим примером.
Код:
public class Atomicity extends Thread {
   
    private int value;
   
    /*volatile*/ static long i;

    public void run() {
        while (true) {
            i = value;
        }
    }

    public static void main(String[] args) {
        new Atomicity(1).start();
        new Atomicity(-1).start();

        while (true)
        {
            long icopy = i;
            if (Math.abs(icopy) != 1)
            System.out.println(icopy);
        }
    }

    public Atomicity(int value)
    {
    super();
    this.value = value;
    }
}


PS/ не уверен будет ли мой пример показательным на 64-битной оси.
5
20 июня 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Rebbit
1. Почитайте про слово volatile

А каким боком volatile относится к атомарности?
Он ведь нужен для сквозного чтения/записи значений ("мимо регистров") в многопроцессорных системах.

276
20 июня 2011 года
Rebbit
1.1K / / 01.08.2005
Цитата: hardcase
А каким боком volatile относится к атомарности?


Вы запускали модифицырованый мной пример?

5
20 июня 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Rebbit
Вы запускали модифицырованый мной пример?


У меня нет Java-компилятора.

276
20 июня 2011 года
Rebbit
1.1K / / 01.08.2005
Цитата: hardcase
У меня нет Java-компилятора.


Без volatile у вас может случится что в определенный момент времени 32 бита будет от одного присваивания, а вторая половина от другого.
У меня выводятся в консоль числа 4294967295 (старшие розряды от 1,а младшые от -1)
и наоборот число -4294967295
Если добавить volatile то поле будет присваиватся и читатся атомарно. И в консоль вообще ничего не выведется. Так как в і будет либо 1 либо -1
В примере из статьи volatile не помагает, потому что -- и ++ не атомарные.
На сколько я понимаю, они розкладаются в чтото типа bufer = i; i = bufer+1;
тоесть чтение и запись в i всеровно будут атомарными, а вот на bufer и произойдет розезд значений.
К примеру 2 трида будут вместе делать инкремент при і=0, а в результате присвоится не 2, а только 1.

240
20 июня 2011 года
aks
2.5K / / 14.07.2006
Хардкейз прав. volatile конструкция полезная, но к атомарности отношения не имеет. )
240
20 июня 2011 года
aks
2.5K / / 14.07.2006
Цитата: Rebbit
Без volatile у вас может случится что в определенный момент времени 32 бита будет от одного присваивания, а вторая половина от другого.


Это будет из-за отсутствия синхронизации доступа к i, а вовсе не из-за отсутствия volatile.

276
20 июня 2011 года
Rebbit
1.1K / / 01.08.2005
Цитата: aks
Хардкейз прав. volatile конструкция полезная, но к атомарности отношения не имеет. )


Скажу чесно - я спецыфикацыи не читал. Но

Цитата: Rebbit
Вы запускали модифицырованый мной пример?

240
20 июня 2011 года
aks
2.5K / / 14.07.2006
Цитата: Rebbit
Вы запускали модифицырованый мной пример?


Нет, а зачем? Мне достаточно посмотреть на него. Там не сотни строк кода.

276
20 июня 2011 года
Rebbit
1.1K / / 01.08.2005
Цитата: aks
Нет, а зачем? Мне достаточно посмотреть на него. Там не сотни строк кода.



Ну хорошо. Вот вам сотни строк, хоть кода там не так уж и много.
http://fuseyism.com/classpath/doc/java/util/concurrent/atomic/AtomicLong-source.html

Обратите внимание каким именно образом реализована атомарность.
Насколько я умею читать то для гет и сет достаточно модификатора volatile
Более сложные операцыи наблюдаем только на конструкцыях типа (читать-модифицыровать-присвоить)

14
20 июня 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: hardcase
У меня нет Java-компилятора.


Для храбрых душой :). Пока бекдоров не замечено

Цитата: aks
Хардкейз прав. volatile конструкция полезная, но к атомарности отношения не имеет. )


Появление volatile действительно кажется странным, но это так:
[QUOTE=JVM Spec]
8.4 Nonatomic Treatment of double and long Variables
If a double or long variable is not declared volatile, then for the purposes of load, store, read, and write operations it is treated as if it were two variables of 32 bits each; wherever the rules require one of these operations, two such operations are performed, one for each 32-bit half. The manner in which the 64 bits of a double or long variable are encoded into two 32-bit quantities and the order of the operations on the halves of the variables are not defined by The Java Language Specification.
[/QUOTE]
и тут же
[QUOTE=JVM Spec]
An implementation is free to implement load, store, read, and write operations for double and long values as atomic 64-bit operations; in fact, this is strongly encouraged.
[/QUOTE]
тоесть пример может работать здесь и не работать тут

276
20 июня 2011 года
Rebbit
1.1K / / 01.08.2005
Вот с этим полностю согласен. :)
На практике оно вроде и роботает, а на другой виртуалке может и поломаться.
240
21 июня 2011 года
aks
2.5K / / 14.07.2006
Дык это только опять же показывает, что присваивание некэшируемой переменной - может быть атомарным. А может и не быть. Это скорее хак, и связывать volatile с атомарностью все же некорректно. Оно для другого предназначено.
Кстати в приведенном реббитом коде как раз таки вызываются unsafe конструкции, использующие судя по всему аппаратные атомарные операции типа сравнения с заменой и т.п.
Если уж хочется работать с атомарными операциями - уж лучше пользоваться тем классом на мой взгляд чем хаками. )
276
21 июня 2011 года
Rebbit
1.1K / / 01.08.2005
Цитата: aks
Это скорее хак, и связывать volatile с атомарностью все же некорректно. Оно для другого предназначено.


Вы правы. Но тем не менее Sun связали и задокументировали.
http://download.oracle.com/javase/tutorial/essential/concurrency/atomic.html

Цитата:

Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).
Reads and writes are atomic for all variables declared volatile (including long and double variables).

63
23 июня 2011 года
Zorkus
2.6K / / 04.11.2006
Атомарность обычно обсуждается в контексте lock-free / wait-free алгоритмов и атомарных примитивов их пакета java.util.concurrent.*, которые используют CAS-инструкции и Java Unsafe API для доступа к ним.
512
25 июня 2011 года
bnm
124 / / 17.10.2004
а как сборщик ведет себя с volatile - переменными?
240
26 июня 2011 года
aks
2.5K / / 14.07.2006
А должен вести как то по особому?
512
26 июня 2011 года
bnm
124 / / 17.10.2004
ну я так понимаю, что сборщик почищает все ресурсы потока - после его завершения, чего не происходит с volatile - ресурсами.. Из чего напрашивается вывод что они почищаются после завершения потока общего прородителя? Если так, то вероятность утечки памяти очень велика, или я чето не правильно понимаю??
240
26 июня 2011 года
aks
2.5K / / 14.07.2006
А что ты имеешь ввиду под подчищением ресурсов потока? Разве сборщик не удаляет ресурсы после того как на них нету ссылок? Не важно из потоков или нет. volatile всего лишь запрещает кэшировать результат. Как это должно помешать сборщику мусора?
512
27 июня 2011 года
bnm
124 / / 17.10.2004
Так в том-то и дело что сборщик удаляет ресурсы на которые нет ссылок, но в случае с volatile - этого не происходит..

public class Atomicity extends Thread {
volatile static int i=0;
boolean b;

Atomicity(boolean b) {
this.b = b;
}

public void run() {
if(b) i++;
System.out.println(i);
}

public static void main(String[] args) {
new Atomicity(true).start();
System.gc();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Atomicity(false).start();
}
}

Выводит 1 1
5
27 июня 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: bnm
Так в том-то и дело что сборщик удаляет ресурсы на которые нет ссылок, но в случае с volatile - этого не происходит..

Для начала нужно понимать, что сборщик мусора не собирает int'ы ;) ЕМНИП объект потока связан с потоком, который выполняется, так что ссылка на него продолжает существовать.

512
28 июня 2011 года
bnm
124 / / 17.10.2004
что значит ЕМНИП объект? изменил на Integer, тоже самое...
5
29 июня 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: bnm
что значит ЕМНИП объект? изменил на Integer, тоже самое...


ЕМНИП.
Читайте внимательно, что вам пишут: сборщик мусора не собирает экземпляр Atomicity лишь потому что он связан с активным потоком, volatile тут совершенно ни при чем.

355
01 июля 2011 года
<SCORP>
786 / / 21.10.2006
эм... а я пример не понял при чём тут сборщик? переменная статическая - кто её куда соберёт здесь?
512
03 июля 2011 года
bnm
124 / / 17.10.2004
[QUOTE=<SCORP>;354191]эм... а я пример не понял при чём тут сборщик? переменная статическая - кто её куда соберёт здесь?[/QUOTE]

Ну и что, что статическая? Мне не понятно следующее: создается экземпляр Atomacity, значение i = 0, изменяем его на 1, убиваем этот экземпляр, создаем новый - По идее у него i должно равняться 0 но оно равняется 1
240
03 июля 2011 года
aks
2.5K / / 14.07.2006
=) Вы точно знаете что такое статическая переменная?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог