Безопасност на нишката на статичен вложен клас - java

Имам статичен клас "Builder" в клас, наречен "MyClass". Ако се опитам да създам два екземпляра на MyClass, използвайки конструктора едновременно от две нишки, ще бъде ли безопасно? Могат ли стойностите, зададени от една нишка, да бъдат присвоени на обект, създаден от друга нишка?

Код:

public class MyClass {
    private int height;
    private int weight;

    private MyClass(Builder builder) {
        height = builder.height;
        weight = builder.weight;
    }

    public static class Builder {
        private int height;
        private int weight;

        public Builder height(int h) {
            height = h;
            return this;
        }

        public Builder weight(int w) {
            weight = w;
            return this;
        }

        public MyClass build() {
            return new MyClass(this);
        }

    }
}

person shadowfax    schedule 05.07.2014    source източник
comment
Защо смятате, че може да е опасно?   -  person Oliver Charlesworth    schedule 05.07.2014
comment
Здравейте shadow, как възнамерявате да използвате вашия builder (моля, предоставете примерен код)?   -  person Anthony Accioly    schedule 05.07.2014
comment
Статичният вътрешен клас не е статичен в смисъл, че е форма на сингълтон, той просто означава, че по същество е клас от най-високо ниво и не може да има косвен достъп до методи и полета в обхващащия тип.   -  person Mark W    schedule 05.07.2014


Отговори (2)


Ако се опитам да създам два екземпляра на MyClass, използвайки конструктора едновременно от две нишки, ще бъде ли безопасно?

Ако имате предвид използването на едно и също копие на Builder и в двете нишки, тогава не, но ако всяка нишка има собствено копие на Builder, тогава ще се оправите. С този вид модел:

MyClass c = new MyClass.Builder().height(10).weight(2).build();

всяко Builder копие е локално за една нишка.

person Ian Roberts    schedule 05.07.2014

Виждам, че получи отговора си. Само да добавя към него, разбира се, конструкторът не е безопасен за нишки. В текущата форма на вашия код, промяната към следното може да го направи така

public static class Builder {
    private volatile int height;
    private volatile int weight;
person ac3    schedule 05.07.2014
comment
Той иска две копия на различни стекове от нишки, няма нужда от volatile в тази ситуация. - person Mark W; 05.07.2014
comment
Не, ако двата екземпляра са създадени от един и същ екземпляр на builder, той ще му трябва. Мислех, че това е въпросът - иначе нямаше да има смисъл дори да говори за безопасност на нишките - person ac3; 05.07.2014
comment
Не, ако двата екземпляра са създадени от един и същ екземпляр на builder - това е глупост, volatile се изисква само ако две нишки ще споделят един екземпляр, в неговия случай няма да го направят. Той смяташе, че статичен вътрешен клас е статичен в смисъл, че ще направи Builder сингълтон. - person Mark W; 05.07.2014
comment
Ако прочетете назад, казах същия „екземпляр на строителя“. Със същия екземпляр на builder, ако не виждате проблем с нишката, това е ваш проблем. Що се отнася до това, което той мисли/мисли, не претендирам за някакво ноу-хау по въпроса - просто казах, че със статичен вътрешен клас нямаше въпрос за никаква безопасност на нишката - това е доста основно - person ac3; 05.07.2014
comment
това е донякъде проблем с x/y тук. Разбира се, отговорът е правилен на зададения въпрос, но като се има предвид как бихте използвали екземпляр на builder, този проблем просто не възниква (по почти същата причина, поради която използването на StringBuilder доминира над StringBuilder с 10000:1). - person Voo; 06.07.2014
comment
Мога ли да предположа, че имахте предвид StringBuilder над StringBuffer? И да, отговорът ми беше само на първоначално зададения въпрос - кой от Могат ли стойности, зададени от една нишка, да бъдат присвоени на обект, създаден от друга нишка? може да означава само използване на един и същ „екземпляр на създател“ за задаване на стойност в една нишка и създаване на обект в друга. Просто казах „не“ и се опитах да направя нещо, което може да направи отговора „да“. - person ac3; 06.07.2014