Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
MBoY4ik
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 30
#1

Не работает volatile. Походу я тупой

21.08.2013, 13:33. Просмотров 602. Ответов 5
Метки нет (Все метки)

Должен выводиться id предыдущего потока в консоль, а выводится id нынешнего потока.

Такое ощущение, что переменная volatile для всех потоков одинаковая

Воть:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class main{
 
    public static void main(String[] args) {
 
        Thread a = new Brain(1);
        Thread b = new Brain(2);
        Thread c = new Brain(3);
 
        a.start();
        b.start();
        c.start();
 
 
    }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Brain extends Thread {
 
    private int id;
 
    volatile int from = 0;
 
    public Brain(int id) {
 
        this.id = id;
 
    }
    public void run(){
        for(int i=1;i<=10;i++){
            System.out.println(id+"___"+from+"___"+i);
 
            from = id;
            try {
                sleep(100);
            } catch (InterruptedException e) {
                System.out.println("Error sleep: "+e);
            }
        }
    }
}
Я уже себе мозг вынес. Одна надежда на вас.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 13:33
Ответы с готовыми решениями:

Volatile
еще не понятен модификатор volatile/ не хотел открывать новую тему.

НЕ понятно volatile
НЕ могу понять как volatile влияет на видимость. Вот например код , булево...

Синхронизация рабочей памяти потоков и volatile
Доброго времени суток. Пытаюсь разобраться с модификатором volatile. Как мне...

Отношение happens-before при использовании volatile переменных
после изменения volatile переменной в ядре в оперативку сбрасывается только...

немножко тупой вопрос
Всем привет! Скажите а можно на джава написать простенький футбол(но чтобы лица...

5
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
21.08.2013, 13:39 #2
всё верно так и должно )
модификатор volatile нужен если вы пытаетесь получить к проперти доступ из других потоков и менять его (он простоо выключает кеширование в потоке), но у вас же нет изменения из других, как стартанули так он и остаётся в рамках собственного потока
0
MBoY4ik
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 30
21.08.2013, 13:47  [ТС] #3
mutagen, не понял прикола. как исправить? что я пропустил? почему я такой дятел?

Добавлено через 1 минуту
mutagen, как изменить переменную из одного потока, прочитать эту же измененную переменную из другого потока.
0
mutagen
2565 / 2238 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
21.08.2013, 14:17 #4
http://java.dzone.com/articles/java-volatile-keyword-0
1
MBoY4ik
1 / 1 / 0
Регистрация: 23.02.2013
Сообщений: 30
21.08.2013, 14:30  [ТС] #5
Напишите пожалуйста пример кода, где volatile переменная изменялась бы из разных потоков.

Или вот мой говнокод. Где же ошибка?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class main{
 
    public static void main(String[] args) {
 
        Thread a = new Brain(1);
        Thread b = new Brain(2);
        Thread c = new Brain(3);
 
        a.start();
        b.start();
        c.start();
 
 
    }
 
 
 
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Brain extends Thread {
 
    private int id;
 
    volatile int from = 1;
 
    public Brain(int id) {
 
        this.id = id;
 
    }
    public void run(){
        for(int i=1;i<=10;i++){
            System.out.println(id+"___"+from+"___"+i);
 
            from++;
            try {
                sleep(100);
            } catch (InterruptedException e) {
                System.out.println("Error sleep: "+e);
            }
        }
    }
}
Добавлено через 9 минут
Примерно разобрался: нужно брать потоки из разных классов.

 Комментарий модератора 
Ещё раз повторяю: не плодите одинаковые темы!
0
easybudda
Модератор
Эксперт CЭксперт С++
10051 / 5971 / 1491
Регистрация: 25.07.2009
Сообщений: 11,302
21.08.2013, 14:44 #6
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package easybudda.examples.trueorfalse;
 
public class TrueOrFalse implements Runnable {
    volatile boolean state = true;
    volatile int timeToDie = 10;
    @Override
    public void run() {
        while ( timeToDie > 0 ) {
            System.out.println("Поток: " + Thread.currentThread().getName());
            if ( state ) {
                state = false;
                System.out.println("Была правда, стала кривда.");
            }
            else {
                state = true;
                System.out.println("Была кривда, стала правда.");
            }
            try {
                Thread.sleep(500);
            }
            catch ( InterruptedException e ) {}
        }
    }
    
    int getCloserToDeath() {
            return --timeToDie;
    }
 
    public static void main(String[] args) {
        TrueOrFalse tof = new TrueOrFalse();
        Thread t1 = new Thread(tof, "Первый");
        Thread t2 = new Thread(tof, "Второй");
        
        t1.start();
        t2.start();
        
        while ( tof.getCloserToDeath() > 0 ) {
            try {
                Thread.sleep(1000);
            }
            catch ( InterruptedException eslip ) {}
        }
        
        try {
            t1.join();
            t2.join();
        }
        catch ( InterruptedException eslip ) {}
 
    }
}
0
21.08.2013, 14:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 14:44

И снова volatile. Глобальный массив, изменяемый в обработчике прерывания, должен быть volatile?
Всем привет. Имеется официальный код примера на чип-трансивер nrf24LE1 от...

Почему работает без volatile?
Добрый день ! Есть переменная bool l = false; которая блокирует цикл в...

Походу ошибка с рипозиториями и не работает команад в kali linux
Всем привет я сталкнулся с такими проблемами сейчас всё опишу: 1 Проблема с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru