Skip to content

Instantly share code, notes, and snippets.

@Vox1oot
Created March 6, 2014 09:57
Show Gist options
  • Save Vox1oot/9386469 to your computer and use it in GitHub Desktop.
Save Vox1oot/9386469 to your computer and use it in GitHub Desktop.
com.javarush.test.level17.lesson10.home05
package com.javarush.test.level17.lesson10.home05;
/* Лишняя синхронизация
synchronized существенно замедляет программу, поэтому убери избыточность synchronized внутри методов
*/
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);
}
}
@AnatoliiStepaniuk
Copy link

Привет! Спасибо за код!
Было бы классно, если бы к решениям еще шли какие-то комменты:-)

@Elbar
Copy link

Elbar commented Apr 15, 2016

+1

@ArtemNovikov
Copy link

Запишу своё понимание решения.

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

public Solution append(CharSequence s) {
    synchronized (Solution.class) {//Эту строку удалил, так как наш класс не объявлен статическим
        if (s == null) {
            synchronized (this) { //Эту строку удаляем так как s внутренняя переменная и получить доступ из вне не получится
                s = "null";
            }
        }

        if (s instanceof String) {
            synchronized (this) {//Эту строку удаляем так как идёт рекурсивный вызов, опять же никто извне ничего не сделает
                return this.append((String) s);
            }
        }

        if (s instanceof Solution) {
            synchronized (this) {//Эту строку удаляем так как метод appendThis синхронизирован
                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();
    synchronized (fields) {//удаляем, так как сам метод синхронизирован и весь код в нём, и читаем внимательно условие
        fields.put("value", value);
        fields.put("count", count);
        fields.put("shared", false);
    }
    synchronized (s) {//тоже самое
        s.writeFields();
    }
}

private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
    synchronized (new java.io.IOException()) {//тут у меня догадки метод - private - это раз, доступен изнутри. также в методе происходит только чтение final полей, поэтому присвоить value и count изменённых значений либо не получится, либо не возможно
        java.io.ObjectInputStream.GetField fields = s.readFields();
        value = (char[]) fields.get("value", null);
        count = fields.get("count", 0);
    }
}

}
`
как-то так

@pridees
Copy link

pridees commented Nov 19, 2017

в коде упущен pswm, понятное дело что он сам по себе очевиден, но всё такие листинг должен быть полным

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment