В зависимости от использования вы можете использовать метод для печати определенной строки. Что-то вроде этого
public void printRow(int r){
for(int i=0; i<table[r-1].length; i++){
if(i>0){
System.out.print(", ");
}
System.out.print(table[r-1][i]);
}
}
В этом примере вы должны называть printRow(2);
, когда хотите распечатать вторую строку.
Да, обновления ссылок гарантированно будут атомарными в спецификации языка.
5.5 Атомарность ссылок на переменные
Считывание и запись следующих типов данных являются атомарными: bool, char, byte, sbyte, short, ushort, uint, int, float и reference. Кроме того, чтение и запись типов перечислений с базовым типом в предыдущем списке также являются атомарными. Чтения и записи других типов, включая длинные, улоновые, двойные и десятичные, а также определяемые пользователем типы, не гарантируются как атомарные.
blockquote>Однако внутри жесткой петли вы можете укусить кеширование регистра. Вряд ли в этом случае, если ваш метод-вызов не вставлен (что может случиться). Лично я бы добавил
lock
, чтобы сделать его простым и предсказуемым, ноvolatile
тоже может помочь. Обратите внимание, что полная безопасность потоков - это больше, чем просто атомарность.В случае кеша я бы посмотрел на
Interlocked.CompareExchange
, лично - т.е. попробовал для обновления , но если он не выполнит повторную работу с нуля (начиная с нового значения) и повторите попытку.
В ответе @Marc Gravell, как указано в C # Language Spec 5.5, важно знать, что понимается под термином «определяемый пользователем тип». Я не нашел четкого определения w.r.t. это использование в языке C # Spec. В UML и в общем выражении класс является экземпляром типа. Но в контексте C # Language Spec это значение неясно.
Справочник по языку Visual Basic «Определенные пользователем типы» (в https://msdn.microsoft.com/en- us / library / cec05s9z.aspx ) говорит
«Предыдущие версии Visual Basic поддерживают пользовательский тип (UDT). Текущая версия расширяет UDT до структуры».
blockquote>, поэтому кажется, что пользовательский тип является структурой, а не классом.
Но ....
В соответствии с «Руководством по программированию на C #» «Типы» (в https://msdn.microsoft.com/en-us/ library / ms173104.aspx ):
«Типичная программа C # использует типы из библиотеки классов, а также пользовательские типы»
blockquote>, который подразумевает, что класс является определяемым пользователем типом. Позднее он приводит пример «сложных пользовательских типов:»
MyClass myClass;
blockquote>, что означает, что «MyClass» - это пользовательский тип , И позже он говорит:
«Каждый тип в CTS определяется как тип значения или ссылочный тип, включая все пользовательские типы в библиотеке классов .NET Framework и ваши собственные пользовательские типы . "
blockquote>... что подразумевает, что все классы, созданные разработчиком, являются« Пользовательским типом ».
И, наконец, есть этот элемент Stackoverflow, в котором значение этого термина обсуждается неубедительно: Как определить, является ли свойство определяемым пользователем типом в C #?
Поэтому, чтобы быть в безопасности, я вынужден рассматривать все классы, созданные мной или те, которые содержатся в .Net Framework, все должны быть определенными пользователем типами, и поэтому Not Thread Safe для назначения , потому что он говорит в разделе 5.5 языка C #:
Чтения и записи ... а также определяемые пользователем типы не гарантируются как атомарные.
blockquote>К сожалению, разговорный термин используется в точной спецификации, такой как C # Language Specification. Из-за этой двусмысленности, чтобы быть потокобезопасным, я могу писать менее оптимальный код, чем это было бы возможно, если окажется, что «Пользовательский тип» не включает классы CLR.
Поэтому Я прошу о дальнейших разъяснениях этого ответа stackoverflow, поскольку его текущая основа ответа оставляет эту значительную двусмысленность. В его нынешнем виде ответ на вопрос «Является ли ссылочным назначением потокобезопасным?» кажется «НЕТ».
bool shouldRun = true;
,while(shouldRun) {...}
и второй поток, который устанавливаетshouldRun = false;
– Marc Gravell♦ 30 August 2015 в 08:43