Комментарии (13)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:41
volatile означает, что значение этой переменной может изменяться другими потоками. Чтобы как следует понять, что делает ключевое слово volatile, полезно разобраться, как потоки обрабатывают обычные переменные. В целях повышения производительности спецификация языка Java допускает сохранение в JRE локальной копии переменной для каждого потока, который на нее ссылается. Такие «локальные» копии переменных напоминают кэш и помогают потоку избежать обращения к главной памяти каждый раз, когда требуется получить значение переменной. Но давайте посмотрим, что происходит в следующем сценарии: запускаются два потока, и один из них считывает переменную A как 5, а второй ― как 10. Если значение переменной А изменилось с 5 на 10, то первый поток не узнает об изменении и будет хранить неправильное значение A. Однако если переменная А помечена как volatile, то когда бы поток не считывал значение A, он будет обращаться к главной копии A и считывать ее текущее значение. Локальный кэш потока имеет смысл в том случае, если переменные в ваших приложениях не будут изменяться извне. Если это не так, то знать, что делает ключевое слово volatile, очень полезно.
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:40
Создать поток можно унаследовав свой класс от класса Thread и переопределив в нем метод run(). Но сам он, конечно, не запустится. Для этого у нашего объекта вызываем метод start(). Для приостановки выполнения текущего потока на какое-то время, используем метод sleep(). метод sleep() — статический: он усыпляет текущий поток. То есть тот, который работает в данный момент. Еще один важный нюанс: поток в состоянии сна можно прервать. В таком случае в программе возникнет исключение InterruptedException. Метод join() приостанавливает выполнение текущего потока до тех пор, пока не завершится другой поток. Что произойдет, если у потока вызвать метод interrupt()? Есть 2 варианта: Если объект находился в этот момент в состоянии ожидания, например, join или sleep, ожидание будет прервано, и программа выбросит InterruptedException. Если же поток в этот момент был в работоспособном состоянии, у объекта будет установлен boolean-флаг interrupted.
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:40
Любой класс в Java содержит неявно заданное статическое поле class типа Class, которое представляет свой класс (содержит всю необходимую о нем информацию). Поскольку мы используем блок синхронизации внутри статического метода getFund(), то в качестве объекта, передаваемого блоку синхронизации, необходимо использовать экземпляр такой статической переменной нашего класса IMF, к которому можно обратиться также, как и к любой статической переменной, используя для доступа ИмяКласса.ИмяПеременной (в нашем случае IMF.class).
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:40
Если мы хотим «обернуть» вызовы методов какого-то объекта своим кодом, то нам нужно: 1) Создать свой класс-обертку и унаследоваться от того же класса/интерфейса что и оборачиваемый объект. 2) Передать оборачиваемый объект в конструктор нашего класса. 3) Переопределить все методы в нашем новом классе, и вызвать в них методы оборачиваемого объекта. 4) Внести свои изменения «по вкусу»: менять результаты вызовов, параметры или делать что-то еще.
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:39
Employee employee = new Doctor;
У employee вызываются переменные и методы Employee, переменные и методы Doctor не видно. Если Doctor оверрайдит методы Employee, вызываются оверридден методы. Что будет вызываться определяется ранним или поздник байндингом. Early binding определяет что переопределяемый метод не final, statoc, private
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:38
* ноль или более символов, которые перед звездочкой . любой знак .* ноль или более любых символов \s пробел \s* ноль или более пробелов [fcl] один символ, который f или с или l [^cl] один символ, не с и не l [c-f] один символ в диапазон от с до f [a-cl] один символ в диапазоне от a до с, а также l [a-cA-Cp] один символ в диапазоне от a до с, A до С, а также p \. игнорировать специальное значение точки \d Цифра. Эквивалентно [0-9] \D Не цифра (любой символ кроме символов 0-9). Эквивалентно [^\d] \s Пустой символ (пробел, табуляция, возврат каретки, перевод строки). Эквивалентно [\n ] ^ Начало текста или отрицание множества $ Конец текста a+ один или более а a? ноль или один а (ha) последовательность (log|ply)wood logwood или plywood {} квантификатор (ha){3} hahaha (ha){2,4} ha от 2 до 4 раз (ha){,4} не более 4 раз ha [\\p{Punct}] все знаки пунктуации
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:37
abstract классы и abstract методы abstract class Figura{ public void abc() { some code } abstract int ploshad(); } У abstract методов не бывает тела. abstract класс может содержать, а может и не содержать abstract методы. Если в классе есть abstract метод, то этот класс тоже должен быть abstract. Невозможно создать объект abstract класса. Дочерний класс должен перезаписать все abstract методы родительского класса или тоже быть abstract. Можно использовать reference variable типа abstract класса чтобы ссылаться на объект дочернего класса, который не является abstract . abstract класс не может быть final. Переменные не могут быть abstract. У abstract классов есть конструктор. Любой перезаписанный метод может быть как abstract, так и не abstract. Для методов недопустимо сочетание: final abstract, private abstract, static abstract Интерфейс – это конструкция языка программирования, которую часто сравнивают с контрактом. В этом контракте указанно, что класс сможет делать, т.е. какие методы в нём будут присутствовать, если он имплементирует данный интерфейс. Когда класс имплементирует какой либо интерфейс, он обязуется снабдить методы этого интерфейса телами (перезаписать абстрактные методы); в противном случае класс должен стать абстрактным. Т.о. если известно, что класс имплементировал какой либо интерфейс, то в этом классе гарантированно будут методы из интерфейса.
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:37
interface Невозможно создать объект интерфейса, потому что это не класс. У интерфейса нет конструкторов. Access modifier у всех топ-левел интерфейсов или public, или default. Если не указать самостоятельно, то компилятор добавит в определение интерфейса слово abstract. Интерфейс не может быть final. Если не указать самостоятельно, то компилятор добавит в определение всех non-default (не access modifier) и non-static методов слова abstract и public. Из переменных в интерфейсе могут быть только константы, которые должны быть в нём инициализированны. Если не указать самостоятельно, то компилятор добавит в определение всех переменных слова public, final и static. Если класс, который имплементировал интерфейс не перезаписал все его методы, то этот класс должен объявляться abstract. Методы интерфейса не могут быть final.
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:34
Обозначение Тип %s String %d целое число: int, long, … %f вещественное число: float, double %b boolean %c char %t Date %% Символ % %3$s треться строка
Alexander Kolesnik
Уровень 35, Москва, Россия
13 декабря 2020, 13:34
Date and Time Formatting Note: Using the formatting characters with “%T” instead of “%t” in the table below makes the output uppercase. FLAG NOTES %tA Full name of the day of the week, e.g. “Sunday“, “Monday“ %ta Abbreviated name of the week day e.g. “Sun“, “Mon“, etc. %tB Full name of the month e.g. “January“, “February“, etc. %tb Abbreviated month name e.g. “Jan“, “Feb“, etc. %tC Century part of year formatted with two digits e.g. “00” through “99”. %tc Date and time formatted with “%ta %tb %td %tT %tZ %tY” e.g. “Fri Feb 17 07:45:42 PST 2017“ %tD Date formatted as “%tm/%td/%ty“ %td Day of the month formatted with two digits. e.g. “01” to “31“. %te Day of the month formatted without a leading 0 e.g. “1” to “31”. %tF ISO 8601 formatted date with “%tY-%tm-%td“. %tH Hour of the day for the 24-hour clock e.g. “00” to “23“. %th Same as %tb. %tI Hour of the day for the 12-hour clock e.g. “01” – “12“. %tj Day of the year formatted with leading 0s e.g. “001” to “366“. %tk Hour of the day for the 24 hour clock without a leading 0 e.g. “0” to “23“. %tl Hour of the day for the 12-hour click without a leading 0 e.g. “1” to “12“. %tM Minute within the hour formatted a leading 0 e.g. “00” to “59“. %tm Month formatted with a leading 0 e.g. “01” to “12“. %tN Nanosecond formatted with 9 digits and leading 0s e.g. “000000000” to “999999999”. %tp Locale specific “am” or “pm” marker. %tQ Milliseconds since epoch Jan 1 , 1970 00:00:00 UTC. %tR Time formatted as 24-hours e.g. “%tH:%tM“. %tr Time formatted as 12-hours e.g. “%tI:%tM:%tS %Tp“. %tS Seconds within the minute formatted with 2 digits e.g. “00” to “60”. “60” is required to support leap seconds. %ts Seconds since the epoch Jan 1, 1970 00:00:00 UTC. %tT Time formatted as 24-hours e.g. “%tH:%tM:%tS“. %tY Year formatted with 4 digits e.g. “0000” to “9999“. %ty Year formatted with 2 digits e.g. “00” to “99“. %tZ Time zone abbreviation. e.g. “UTC“, “PST“, etc. %tz Time Zone Offset from GMT e.g. “ -0800 “.