Почему переменная переменная обычно закрыта? - PullRequest
1 голос
/ 02 февраля 2011

У меня есть два класса - класс 'MyDerived' является производным от абстрактного базового класса 'MyBase'.Также PrimaryDerivedClass также наследует MyBase.Сначала я создаю экземпляр PrimaryDerivedClass, который затем создает экземпляры 'MyDerived'.

MyBase имеет защищенный метод с именем ProcessThread, который используется как ThreadPool.QueueUserWorkItem(ProcessThread) при создании нового экземпляра PrimaryDerivedClass и MyDerived созданы.Теперь, когда я хочу остановить все потоки в некотором сценарии, я устанавливаю для некоторой логической переменной volatile значение TRUE, и когда любой другой поток находит значение переменной volatile = TRUE, он останавливает обработку.

Когда я объявил 'private volatile bool stopThreadsMyBase, я не понял предполагаемого поведения.Однако, когда я сделал это static или public, я мог видеть то, что я пытаюсь достичь.Что было бы неправильно в случае private volatile?

Если оставить в стороне вышеуказанное требование, у меня возникает вопрос: Обычно я видел, что volatile переменная объявляется как private.Есть ли какой-то важный аспект, из-за которого он обычно объявляется закрытым?

(Я новичок в многопоточности.)

Ответы [ 3 ]

2 голосов
/ 02 февраля 2011

Никакое изменение модификатора доступа с частного на общедоступное не повлияет на поведение изменяемого поля (по крайней мере, на изменчивость). У вас есть другая проблема, о которой мы не можем догадаться, не увидев ваш код.

Отладка многопоточности является сложной задачей, поскольку способ выполнения кода недетерминирован - вы не можете предсказать, когда именно ваши потоки будут работать.

Тот факт, что энергозависимые поля являются частными, заключается в том, что они используются классом для внутренней синхронизации. Они являются частью его реализации, а не его интерфейса.

1 голос
/ 02 февраля 2011

Это «странное» поведение просто из-за модификатора доступа. Приватный означает, что эта переменная доступна только из класса, в котором она была определена. Все производные классы не имеют к ней доступа, поэтому при изменении значения изменчивой переменной базового класса она изменяется только для только для внутреннего класса базового класса .

Все классы, которые наследуются от базы, должны иметь собственную реализацию stop-прямо-сейчас. Но все меняется, когда вы устанавливаете эту переменную как общедоступную (что означает отсутствие ограничений доступа, она доступна везде) или статическую (что означает, что значение одинаково для всех экземпляров, поскольку оно «принадлежит» не экземпляру, а классу и доступно по имени класса, а не по экземпляру). Если вы хотите, чтобы ваша переменная была доступна для производных, вы должны пометить ее как защищенную.

http://msdn.microsoft.com/en-us/library/wxh6fsc7.aspx - в этой статье показано значение модификаторов доступа.

1 голос
/ 02 февраля 2011

Изменчивые поля являются частными, потому что они являются полями, а не изменчивыми. Если вам нужно предоставить значения, используйте свойства, которые позволяют скрыть детали реализации.

В этом случае, возможно, вы измените свой volatile Boolean на ManualResetEvent без необходимости изменения кода, вызывающего obj.StopThreads = true Можно утверждать, что метод с именем Stop () будет лучше, чем свойство вместе взятые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...