Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 31.03.2018, 20:09   #1
Liade
Новичок
 
Регистрация: 28.05.2009
Сообщений: 1
Репутация: 10
По умолчанию Не понимаю почему метод должен быть синхронизирован

Недавно начал изучение Java, сейчас решаю задачки. Прохожу тему многопоточности, конкретно синхронизацию потоков.
В коде который прикладываю ниже мне непонятно следующее:
почему метод readObject не синхронизирован? (посмотрел решение)
writeObject читает value и count, а readObject в них пишет, и, насколько я понимаю, оба должны быть синхронизированы.
Приведу цитату из философии Java
Цитата:
"Если вы записываете данные в переменную, которая может быть затем прочитана другим потоком, или читаете данные из переменной, которая могла быть записана другим потоком, вы должны использовать синхронизацию. Кроме того, и читающий, и записывающий потоки должны синхронизироваться по одной блокировке."
Здесь именно такой случай, или я что-то путаю?


Код:

public class Solution {
    char[] value;
    int count;

    public Solution append(CharSequence s) {
        if (s == null) {
                s = "null";

        }

        if (s instanceof String) {
                return this.append((String) s);

        }

        if (s instanceof Solution) {
                return this.appendThis((Solution) s);

        }

        return this.append(s);
    }

    public synchronized Solution appendThis(Solution s) {
        //do something here....
        return this;
    }

    private static final java.io.ObjectStreamField[] serialPersistentFields =
            {
                    new java.io.ObjectStreamField("value", char[].class),
                    new java.io.ObjectStreamField("count", Integer.TYPE),
                    new java.io.ObjectStreamField("shared", Boolean.TYPE),
            };

    private synchronized void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {
        java.io.ObjectOutputStream.PutField fields = s.putFields();
        fields.put("value", value);
        fields.put("count", count);
        fields.put("shared", false);

        s.writeFields();

    }

    private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
        java.io.ObjectInputStream.GetField fields = s.readFields();
        value = (char[]) fields.get("value", null);
        count = fields.get("count", 0);

    }

    public static void main(String[] args) {

    }
}

Liade вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ну вот опять реакция на новости. политики - дебилы. Политический тезис должен быть таким - "дети должны быть все в детских садах!" Alar Свободное общение 55 01.07.2016 11:07
Художник, - должен быть голодным! Smitt&Wesson Свободное общение 0 06.04.2014 06:24
Каким должен быть код? pufystyj Свободное общение 5 15.08.2012 01:29
Почему модификатор доступа в интерфейсе должен быть public? mike_tihomirov Общие вопросы .NET 5 09.12.2010 22:33


21:20.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru