2017-02-22 1 views
0

меня есть класс, как указано ниже:
Две нити, используя тот же объект, но изменив seprate свойство объекта

public class Test { 
    public Test1 a; 
    public Test2 b; 
} 

Теперь у меня есть 2 темы.

Thread 1 модифицирует «test1» и нить 2 модифицирует «test2»

Может ли возможность повреждения данных, т.е. в то время как поток 1 был модифицирование «Test1» класс, но между ними нить 2 пришла и начала модификация «Test2» и, следовательно, изменения были потеряны или данные были повреждены/неполное обновление?

+0

Есть ли причина, о которой вы так думаете? –

ответ

1

В описанном вами сценарии не может быть никакого искажения данных, поскольку две области модификации не пересекаются. Проблема будет возникать только в том случае, если один поток пытается получить доступ к данным, которые другой поток находится в процессе модификации. Изменение Test1 не влияет на Test или Test2.

+0

thanks @Jim, который очищает мое сомнение –

1

Это очень просто: когда более чем одной нити пишет совместно данных; то есть вероятность повреждения данных. Когда один поток пишет и другие , читайте, то это шанс, что читатели видят противоречивые данные.

В вашем примере это, похоже, не так.

Или наоборот: если любой модификаций в поле a каким-либо образом повлиять на поле b; то у вас возникла проблема.

Но помимо этого: плохой стиль имеет public поля, которые обрабатываются внешними компонентами. Когда a необходимо обновить; то это должно произойти посредством вызова метода на вашем объекте Test.

И кроме этого: не забудьте про Single Responsibility Principle! То, что составляет «один» класс, тесно связано. Поэтому звучит также странно, что у этих двух совершенно независимых вещей есть один класс ...

+0

_ «когда несколько потоков записываются в общие данные» _ - на самом деле это когда один поток _modifies_ данные, которые читаются другим потоком. –

+0

Я думаю, что мое утверждение верно; но чего-то не хватает. Это прямо сейчас. – GhostCat

+0

спасибо ghostCat. Я действительно использовал частные поля и использовал getters & seters. Вышеприведенный код был, например. Спасибо за ваш ответ. Класс Test1 и Test2 являются отдельными, и модификация любого из них не влияет на другой. –

Смежные вопросы