Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 73
1

Многопоточность, чтение и запись переменной типа стринг

10.10.2015, 02:08. Показов 2200. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
всем привет!
реализовал небольшой алгоритм, суть задания была в следующем:
Реализовать «синхронные» методы чтения/записи для переменной типа String. Правила обращения следующие:
a. Записывать в одно время может только один поток, любой следующий «писатель» должен ждать (блокироваться).
b. Если один поток выполняет запись, то любой читатель должен ждать завершения этой записи.
c. Пока происходит чтение, запись невозможна.
d. Однако требуется избежать такой ситуации, когда запись невозможна из-за сменяющих друг друга операций чтения.
e. Любое количество читающих потоков могут читать одновременно

вот что получилось у меня:


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package Potoki;
 
public class MainClass {
 
    public static volatile String s = "Start: ";
 
    public static void main(String args[]) {
        ThreadWrite thrWr1 = new ThreadWrite('x'), thrWr2 = new ThreadWrite('y');
        ThreadRead thrRd1 = new ThreadRead(1), thrRd2 = new ThreadRead(2);
        thrWr1.start();
        thrWr2.start();
        thrRd1.start();
        thrRd2.start();
        try {
            thrWr1.join();
            thrWr2.join();
            thrRd1.join();
            thrRd2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
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
package Potoki;
 
public class ThreadWrite extends Thread {
    private char simbol;
 
    public ThreadWrite(char c) {
        simbol = c;
    }
 
    @Override
    public void run() {
        while (true) {
            synchronized (MainClass.s) {
                MainClass.s += simbol;
                System.out.println("запись потоком " + simbol + " строка: " + MainClass.s);
            }
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package Potoki;
 
public class ThreadRead extends Thread {
    private int name;
 
    ThreadRead(int i) {
        name = i;
    }
 
    public void run() {
 
        try {
            while (true) {
                System.out.println("чтение потоком " + name + " строка: " + MainClass.s);
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

у меня вопрос в следующем, когда просмотрел консольку, то увидел следующее:
...
чтение потоком 2 строка: Start: yxyxyxyxy
запись потоком y строка: Start: yxyxyxyxy
запись потоком x строка: Start: yxyxyxyxyx
запись потоком x строка: Start: yxyxyxyxyxx
запись потоком y строка: Start: yxyxyxyxyxxy
чтение потоком 2 строка: Start: yxyxyxyxyxx
чтение потоком 1 строка: Start: yxyxyxyxyxx
чтение потоком 1 строка: Start: yxyxyxyxyxxyx
чтение потоком 2 строка: Start: yxyxyxyxyxxy
запись потоком x строка: Start: yxyxyxyxyxxyx
запись потоком y строка: Start: yxyxyxyxyxxyxy
...
почему у меня в пятой строчке записывается Start: yxyxyxyxyxxy, а в шестой строчке выводится чтение потоком 2 строка: Start: yxyxyxyxyxx, то-есть на один символ меньше, по идее он же уже его записал, и переменная типа volatile, и синхронизацию сделал, что ему ещё не хватает? или так должно быть? если да, то почему?
возможно я неправильно вообще код реализовал, в общем помогите исправить либо код, либо подскажите, почему у меня так программка работает, всем спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2015, 02:08
Ответы с готовыми решениями:

Запись слова в переменную типа Стринг до тех пор пока не пробел
Добрый день, как можно записать в переменную типа Стринг слово введенное пользователем, пока не...

Запись и чтение файла своего типа
есть файл записанный на delphi : tf: file of crd; tf=assignfile('1.data'); write(tf,sr);...

Многопоточность, чтение переменной, несколько lock
Смотрите, есть переменная, ее изменение происходит с помощью lock int count = 0; // ... lock...

Чтение переменной типа float из textBox
Задача - написать программу в Windows Forms, которая переводит дробное число в денежный вид. Есть...

2
Эксперт Java
4092 / 3826 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
10.10.2015, 03:38 2
Вообще судя по описанию задания вам отлично подойдёт ReentrantReadWriteLock. Нет ограничений на те классы которые можно использовать?

Пункт b у вас не совсем честно выполнен.

Цитата Сообщение от алексашк Посмотреть сообщение
и так должно быть? если да, то почему?
Да, так и должно быть. Чтение переменной и вывод на экран - две разные операции, за счёт этого получается такой результат.
0
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 73
10.10.2015, 03:43  [ТС] 3
про ReentrantReadWriteLock почитаю, ограничений по классам нет, спасибо за ответ
0
10.10.2015, 03:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.10.2015, 03:43
Помогаю со студенческими работами здесь

Запись/чтение переменной из файла
Добрый день. Стоит такая задача, нужно сделать чтобы переменная записывалась в блокнот. Потом чтобы...

Запись и чтение переменной в файл
К примеру нужно записать переменную Peremennaya типа String в файл Dat.txt на первую строчку, как...

Запись и чтение из файла строковой переменной
Перехожу и Builder6 на XE. исправил кучу ошибок. в одном не могу развобраться. вот пример:...

Побайтовое чтение и запись любого типа файлов
Добрый вечер! Мне нужно побайтово прочитать файл любого расширения, а дальше уже проводить операции...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru