• 0.00

  • 0.00

  • ,

Онлайн-стажировка: летний набор 2017

Набор на летнюю стажировку 2017 года окончен. Начало стажировки — завтра, 06.07.2017

Предположительно, набор на осеннюю стажировку 2017 года начнется в сентябре

Good News, Everyone!
С радостью сообщаем Вам, что сегодня начался очередной набор на онлайн стажировку!

Набором на стажировку буду заниматься я (silent).
javarush.ru/users/717740

У Вас есть уникальная возможность получить опыт в работе с такими технологиями: Git, Spring, Spring MVC, Spring Security, Hibernate, JPA, Junit, JSP, JSTL, ORM, REST, Bootstrap, AJAX и jQuery.
Конечно, за 12 недель слишком глубоко все это не выучить, но, во-первых, Вы сможете указать эти технологии в своем резюме, а во-вторых, очень вероятно, что за эти 12 недель Вы узнаете о программировании больше, чем 5 лет универа. Выбор за Вами.

Записывайтесь, только если сможете уделять обучению 6-8 часов в неделю. Отзывы предыдущих участников можно почитать тут.

Условия участия:
1) Ваш уровень на JavaRush 35 или выше
2) У Вас есть (или была, но закончилась меньше года назад) годовая подписка Internship, Internship+, Mentor или Premium Project. Или у Вас есть активная подписка PREMIUM PRO.
3) Вы выполнили тестовое задание

Если Ваш уровень ниже 35-го, но хотя бы 30+, Вы можете попробовать дойти до 35-го уровня. Набор на онлайн-стажировку будет продолжаться до до 5 июля включительно (до 14:00 по МСК), так что 3 недели у Вас есть.

В новом JavaRush механизм апгрейда подписок не предусмотрен, поэтому если Ваша подписка не предусматривает участие в стажировке, а участвовать Вы хотите, Вам нужно обзавестись подпиской PREMIUM PRO. Если раньше участии в стажировке было возможно лишь с годовой подпиской (Internship, Internship plus и пр.), то сейчас Вы можете оплачивать стажировку помесячно подпиской PREMIUM PRO. Оплату нужно вносить каждый месяц начиная с месяца набора (в данном случае — это июнь) и заканчивая последним месяцем стажировки — сентябрь. Итого выходит 4 месяца оплаты подписки PREMIUM PRO.

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

Онлайн стажировка – это отличный способ получить практический опыт (за Ваши деньги).

Где можно записаться:

Оставьте свои контактные данные в разделе «Стажировка» -> «Отправить заявку». Так же Вам надо прислать ссылку на выполненное тестовое задание. Пример:
Заявка на стажировку

Тестовое задание надо выполнить обязательно. Если Вы не в состоянии справится с тестовым заданием, значит Вам будет не по силам половина заданий онлайн-стажировки. Лучше порешайте задачи на JavaRush – они в разы проще.

Следующая стажировка планируется через 3 месяца – не справились с тестовым заданием в этот раз – значит справитесь в следующий. Лучше хорошо понимать часть материала, чем просто прочитать/просмотреть (но не разобраться) в большом его количестве.

Начиная с прошлого набора на стажировку, Стажировку можно проходить столько раз, сколько Вы хотите. Если вы регистрируетесь на стажировку повторно — тестовое задание отправлять не нужно.

Сроки:
Стажировка длится 12 недель.
Набор открыт до 5 июля включительно (до 14:00 по МСК), старт самой стажировки – 6 июля.
После 5 июля заявки приниматься не будут – будете ждать следующей стажировки (ориентировочно октябрь 2017 года).

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

Проект рассчитан на 12 недель (3 месяца). Каждую неделю Вы будете изучать очередную технологию и добавлять очередной кусок функциональности к Вашему проекту.

План обучения и список изучаемых технологий можно посмотреть здесь.

Формат занятий
В начале каждой недели Вы будете получать видеозапись урока (длиной 2-3 часа!), на которой разбирается и объясняется очередная технология, а также дается задание на дом, которое Вы должны сделать за неделю. Задания средней сложности. Если в первый день вы во всем разобрались, то сделайте его за 1-2 дня. Если сразу не поняли, то в неделю должны вложиться.

Правильное решение
Через неделю куратор стажировки выкладывает свое решение, и Вы можете посмотреть/разобрать его, независимо от того, заработало у Вас Ваше решение или нет.
Это очень эффективный подход, т.к. разбирать решения опытных разработчиков может быть на порядок полезнее, чем сделать свое кое-как. Особенно, если Вы только что днями ломали голову, ища способ все сделать хорошо, быстро и красиво.

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

Процесс регистрации на стажировку
(«Стажировка» -> «Отправить заявку») далее скачиваете задание.
Решаете, заполняете все формы, нажимаете «Отправить заявку».
После того, как Вы отправили заявку на стажировку, на карте квестов (https://javarush.ru/quests) статус стажировки будет «Проходится»:
Вы отправили заявку на стажировку
После этого я рассматриваю Вашу заявку.
1. Если у Вас нет подписки, которая дает право проходить стажировку — Вам на e-mail придет письмо об этом.
2. Если у меня будут замечания по Вашему решению — Вам на e-mail придет письмо с моими замечаниями.
3. Если все хорошо — я принимаю Вас на стажировку. Указывайте правильный почтовый адрес, так как Вам на почту придет письмо с дальнейшими инструкциями.

Для тех, кто продолжает пользоваться сайтом JavaRush 1.0, Вы можете подать заявку как через старый сайт, так и через новый (требуемый уровень для участия — 35, а не 30).

Если будут вопросы по тестовому, задавайте в этом топике.

Заявки на стажировку будут рассматриваются 2-3 раза в неделю в зависимости от количества заявок.
  • ,

Тестовое задание в одну из крупных IT компаний Беларуси

Всем привет! Как и обещала в комментарии к прошлой статье, выкладываю тестовое задание по J2SE и JavaEE которое мне прислали для зачисления на стажировку. Для его выполнения дается 30 минут. Правда, сохранить успела 12 из 14 вопросов.

— означает, что может быть несколько вариантов ответа
* означает, что может быть только один вариант ответа

  1. Вопрос
  2. Integer a = new Integer(2);
    Integer b = new Integer(2);
    
    What code will provide output: "false"? Check all that apply.
    
    Варианты ответов:
    - System.out.println(a.intValue() == b.intValue());
    - System.out.println(a.compareTo(b));
    - System.out.println(a.equals(b));
    - System.out.println(a == b);
  3. Вопрос
  4. Which HTTP methods are NOT considered idempotent (multiple execution of query
     will give the same result)? (Choose all that apply)
    
    Варианты ответов:
    - GET
    - POST
    - HEAD
    - PUT
  5. Вопрос
  6. How should servlet developers handle the HttpServlet's service() method when
     extending HttpServlet? (Choose all that apply).
    
    Варианты ответов:
    - They should override the service() method in most cases.
    - They should call the service() method from doGet() or doPost().
    - They should call the service() method from the init() method.
    - They should override at least one doXXX() method (such as doPost()).
  7. Вопрос
  8. Which methods are used by a servlet to handle form data from a client?
     (Choose all that apply)
    
    Варианты ответов:
    - HttpServlet.doHead()
    - HttpServlet.doPost()
    - HttpServlet.doForm()
    - ServletRequest.doGet()
    - ServletRequest.doPost()
    - ServletRequest.doForm()
  9. Вопрос
  10. Given the Product Bean:
    
    public class Product{
    public Product(String title, int size){
    this.title = title;
    this.size = size;
    }
    String title;
    int size;
    }
    
    How would servlet code from a service method (e.g. doPost()) pass a Product bean
     info to the jsp?
    
    Варианты ответов:
    * response.setAttribute("product", new Product("Shirt", t));</li>
    * response.setParameter("product", new Product("Shirt", t));</li>
    * request.setAttribute("product", new Product("Shirt", t));</li>
    * request.setParameter("product", new Product("Shirt", t));</li>
    
  11. Вопрос
  12. You have to create your own type of exception, named UserOperationExсeption.
     And you need to make it a checked exсepetion. What is the appropriate signature in
     this case? Check all that apply.
    
    Варианты ответов:
    - public class UserOperationExсeption extends RuntimeExсeption{...}
    - public class UserOperationExсeption extends Exсeption{...}
    - public class UserOperationExсeption extends IOExсeption{...}
    - public class UserOperationExсeption extends extends Error{...}
    
  13. Вопрос
  14. Given following classes hierarchy:
    
    public class Building {...}
    public class Warehouse extends Building {...}
    public class Shop extends Building {...}
    public class SportsShop extends Shop {...}
    
    and code:
    
    ...
    Building b1 = new Building();
    Building b2 = new Warehouse();
    ...
    
    What code will cause a ClassCastException to be thrown? Check all that apply.
    
    Варианты ответов:
    - Warehouse w1 = b2;
    - Warehouse w2 = (Warehouse) b2;
    - Warehouse w3 = new SportsShop();
    - Shop s1 = (Shop)b1;
    - Shop s2 = new SportsShop();
  15. Вопрос
  16. Given the method:
    
    public int shift(int value, int offset)
    {
    value += offset;
    return value;
    }
    
    What will be the output of following code:
    
    int v = 2;
    shift(v,5);
    System.out.println(v);
    
    Варианты ответов:
    * 2
    * 5
    * 7
    * 3
    
  17. Вопрос
  18. Given:
    
    public class Product {
    public Product(String title, int size){
    this.title = title;
    this.size = size;
    }
    String title;
    int size;
    
    public String toString()
    {
    return title + ":" + size;
    }
    }
    ...
    Set products = new HashSet();
    products.add(new Product("Hat", 3));
    products.add(new Product("Hat", 3));
    System.out.println(products);
    
    What items will be in the programm output, considering that Product class inherits
     equals() and hashCode() methods from Object?
    
    Варианты ответов:
    * Hat
    * [Hat:3, Hat:3]
    * [Hat:3]
    * RuntimeException about duplicate elements
  19. Вопрос
  20. What code is valid for creating immutable list?
    
    Варианты ответов:
    * List immutableItems = Collections.unmodifiableList(new ArrayList());
    immutableItems.add("i1");
    immutableItems.add("i2");
    
    * List items = new ArrayList();
    items.add("i1);
    items.add("i2");
    List immutableItems = Collections.unmodifiableList(items);
    
    * List items = new ArrayList();
    items.add("i1);
    items.add("i2");
    final List immutableItems = items;
    
    * List can't be immutable
  21. Вопрос
  22. What is complexity (Big 0 notation) of ArrayList contains() method?
    
    Варианты ответов:
    * 0(n^2)
    * 0(log(n))
    * 0(n)
    * 0(1)
    
  23. Вопрос
  24. Given and array of size n, suppose you need to write a program that
     calculates the sum of every second element of this array. What will be the
     complexity (Big 0 notation) of most optimal implementation of this algorithm?
    
    Варианты ответов:
    * 0(n^2)
    * 0(n/2)
    * 0(n)
    * 0(1)

Предлагаю обсудить какие варианты ответов правильные.

Подготовка к стажировке: об изучении JavaScript, SQL, HTML\CSS, UML



Добрый день, уважаемые джаварашевцы и джаварашатессы!

Имея целью мировое господство изучение языка Java, признал необходимость прохождения стажировки. Изучение вопроса показало, что прохождения курса JavaRush совершенно недостаточно для исполнения тествового задания и прохождения стажировки. Кроме Java Core требуется хотя бы поверхностно знать еще дюжину технологий. Знатоки рекомендуют осваивать эти технологии параллельно с курсом JavaRush.

Итак, имея целью мировое господство изучение языка Java пришлось взяться за изучение этих самых дополнительных технологий. Не всех сразу разумеется. А тех, которые попроще, к которым я уже готов. Если конкретнее, то пока взялся за JavaScript и SQL. На очереди XHTML\CSS\HTML5 и UML. Ниже хочу поделиться перечнем материалов, подобранных для обучения по заявленным темам.

Структура обучения сформирована следующим образов. Во-первых, освоение популярного курса, позволяющего усвоить основы язык\технологии. Во-вторых планирование книг для более углубленного изучения, в случае наличия необходимости или возможности. И в-третьих, решение «задач» по изученной теме для поддержания знаний и приобретения опыта.

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

SQL

Первоначальное изучение темы: Head First «Изучаем SQL», Мартин Грубер «Понимание SQL».

Углубленное изучение темы: Поль Дюбуа «MySQL. Сборник рецептов».

Решение задач по теме: Сайт sql-ex.ru

XHTML\CSS\HTML5
Первоначальное изучение темы: Head First «Изучаем XHTML\CSS», Head First «Изучаем HTML 5»,

Углубленное изучение темы: конкретные книги пока не определены. Нужно подобрать фундаментальные труды по HTML 5 и CSS 3. Так как пока эту тему не изучал, то не знаю актуален XHTML сверх базового курса или нет.

Есть хорошая книга «CSS. Каскадные таблицы стилей. Подробное руководство» автора Эрика А. Мейера. Но она на русском для версий 2 и 2.1 существует. Не знаю на сколько это актуально при наличии CSS3.

Решение задач по теме: www.itmathrepetitor.ru/zadachi-po-html-i-css/

JavaScript

Первоначальное изучение темы: Head First «Изучаем JavaScript», Head First «Изучаем JQuery». Опционально, по нерассмотренным темам ресурс learn.javascript.ru/

Углубленное изучение темы: Дэвид Флэнаган «JavaScript. Подробное руководство (6-е издание)»

Решение задач по теме: gist.github.com/codedokode/ce30e7a036f18f416ae0#%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%BA%D0%B8-%D0%BD%D0%B0-js

vk.com/zadachi_javascript_jquery

www.itmathrepetitor.ru/zadachi-po-javascript-iz-knigi-vyrazitelnyjj-javascript/

UML

Первоначальное изучение темы: Фаулер М. «UML. Основы»

Углубленное изучение темы: Джим Арлоу и Айла Нейштадт «UML 2 и унифицированный процесс. Практический объектно-ориентированный анализ и проектирование», 2е издание, Дж. Рамбо, М. Блаха — UML 2.O. Объектно-ориентированное моделирование и разработка

Решение задач по теме: Задачи есть в книге Рамбо и Блаха. В остальном наверное, придется придумывать задачи самому. Например, пытаться проектировать приложения. Взять банальный Блокнот и попытаться написать схему его работы в разрезе ООП.

Опытом в изучении других необходимых для стажировки технологий (Spring, Spring MVC, Hibernate, ООП, JDBC, Servers + Servlets +JSP, ORM, Web-frameworks, Web-services (SOAP, REST), Maven, Tomcat) буду делиться по мере приобретения этого самого опыта.

Любящие путешествия в сети интернет могут проследовать по этой ссылке в поисках всех упомянутых в этой статье книг. И если у вас спросят пароль, не надо говорить Der Parol, скажите javarushvorever.

Удачи в изучение Java и всех, всех, всех!

С уважением,
Зеленая лягушка
(14 уровень).
  • ,

Первый язык для подростка перед Java

Уважаемые коллеги! Прошу посоветовать первый для изучения язык программирования, если вторым языком будет, скорее всего, Java. Мальчику пятнадцать. С английским языком у него проблем нет — почти как родной.
Заранее благодарю за аргументированные ответы.

История одного собеседования: интересные вопросы

Недавно мне довелось посетить собеседование на позицию стажёра в одной из крупных IT-компаний.
Это было моё первое IT-собеседование и, на мой взгляд, оно выдалось интересным. В общей сложности меня “допрашивали” больше 3 часов (этому предшествовали ещё домашние задания и тест в офисе на компьютере).
Хочу отдать должное собеседующему, который не ставил крест, когда я отвечал на вопрос неверно, а с помощью своих наводящих вопросов заставлял меня вдумываться и приходить к верному ответу.

Ниже я представлю несколько “зарисовок” – на мой взгляд, достаточно интересных вопросов, некоторые из которых дали мне более глубокое понимание отдельных аспектов в Java. Возможно, кому-то эти вещи покажутся очевидными, но думаю, найдётся те, для кого это будет полезно.

Посоветуйте обще-краткие учебные материалы по Spring, Hibernate, Java Script, AJAX, Maven, Tomcat

Добрый день, уважаемые джаварашевцы и джаварашатессы!
В целях подготовки к стажировке знающие джаварашевцы настоятельно советуют «пройдите хотя бы маленькие обучалки в интернете» по следующим технологиям: Spring, Hibernate, Java Script, AJAX, Maven, Tomcat.

Прошу подсказать эти самые «маленькие обучалки». Я так понимаю, что имеются в виду поверхностные материалы, дающие общее представление о данных технологиях. Формат можно подсказывать любой: статьи, небольшие книжки, видео-курсы, онлайн-курсы и т.д.

С уважением,
Зеленая лягушка.

Дополнение. За рекомендацию «не кратких», а обстоятельных и пользующихся заслуженной славой ресурсов\книг по заявленным темам тоже буду благодарен.

Тестовое задание на стажировку JavaRush: Полезные ссылки и хинты

Хочу поделиться с вами полезными ссылками, хинтами и советами, которые помогут при выполнении тестового задания на стажировку в реальный проект на JavaRush.

Конечно, можно просто бездумно накопировать решение тестового задания из интернета, благо примеров хватает, но мы-то хотим разобраться, что делаем :) Этот пост для тех, кто не обнаружил среди стека технологий, требующихся по заданию, знакомых слов и хочет это исправить)
  • ,

Онлайн-стажировка: весенний набор

Внимание!!! Набор на весеннюю онлайн стажировку закончен.
Ориентировочно следующий набор начнется в июне 2017 года.


Внимание!!! Кому на почту не пришло письмо с приглашением на онлайн-стажировку — напишите мне в личном сообщении

Good News, Everyone!
С радостью сообщаем Вам, что начался очередной набор на онлайн стажировку!

Набором на стажировку буду заниматься я (silent).

У Вас есть уникальная возможность получить опыт в работе с такими технологиями: Git, Spring, Spring MVC, Spring Security, Hibernate, JPA, Junit, JSP, JSTL, ORM, REST, Bootstrap, AJAX и jQuery.
Конечно, за 12 недель слишком глубоко все это не выучить, но, во-первых, Вы сможете указать эти технологии в своем резюме, а во-вторых, очень вероятно, что за эти 12 недель Вы узнаете о программировании больше, чем 5 лет универа. Выбор за Вами.

Записывайтесь, только если сможете уделять обучению 6-8 часов в неделю. Отзывы предыдущих участников можно почитать тут.

Условия участия:
1) Ваш уровень на JavaRush 30 или выше
2) У Вас есть (или была, но закончилась меньше года назад) годовая подписка Internship, Internship+, Mentor или Premium Project. Или у Вас есть активная годовая подписка PREMIUM PRO.
3) Вы выполнили тестовое задание

Если Ваш уровень ниже 30-го, но хотя бы 25+, Вы можете попробовать дойти до 30-го уровня. Набор на онлайн-стажировку будет продолжаться до 15 марта включительно, так что 3 недели у Вас есть.

В новом JavaRush механизм апгрейда подписок еще не реализован, поэтому если Ваша подписка не предусматривает участие в стажировке, а участвовать Вы хотите, Вам нужно обзавестись подпиской PREMIUM PRO. Если раньше участии в стажировке было возможно лишь с годовой подпиской (Internship, Internship plus и пр.), то сейчас Вы можете оплачивать стажировку помесячно подпиской PREMIUM PRO. Оплату нужно вносить каждый месяц начиная с месяца набора (в данном случае — это февраль) и заканчивая последним месяцем стажировки — май. Итого выходит 4 месяца оплаты подписки PREMIUM PRO.

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

Онлайн стажировка – это отличный способ получить практический опыт (за Ваши деньги).

Где можно записаться:

Оставьте свои контактные данные в разделе «Стажировка» -> «Отправить заявку». Так же Вам надо прислать ссылку на выполненное тестовое задание. Пример:
Заявка на стажировку

Тестовое задание надо выполнить обязательно. Если Вы не в состоянии справится с тестовым заданием, значит Вам будет не по силам половина заданий онлайн-стажировки. Лучше порешайте задачи на JavaRush – они в разы проще.

Следующая стажировка планируется через 3 месяца – не справились с тестовым заданием в этот раз – значит справитесь в следующий. Лучше день потерять, потом за пять минут долететь.

Начиная с этого набора на стажировку, Стажировку можно проходить столько раз, сколько Вы хотите. Если вы регистрируетесь на стажировку повторно — тестовое задание отправлять не нужно.

Сроки:
Стажировка длится 12 недель.
Набор открыт до 15 марта включительно, старт самой стажировки – 16 марта.
После 15 марта заявки приниматься не будут – будете ждать следующей стажировки (ориентировочно июль 2017 года).

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

Проект рассчитан на 12 недель (3 месяца). Каждую неделю Вы будете изучать очередную технологию и добавлять очередной кусок функциональности к Вашему проекту.

План обучения и список изучаемых технологий можно посмотреть здесь.

Формат занятий
В начале каждой недели Вы будете получать видеозапись урока (длиной 2-3 часа!), на которой разбирается и объясняется очередная технология, а также дается задание на дом, которое Вы должны сделать за неделю. Задания средней сложности. Если в первый день вы во всем разобрались, то сделайте его за 1-2 дня. Если сразу не поняли, то в неделю должны вложиться.

Правильное решение
Через неделю куратор стажировки выкладывает свое решение, и Вы можете посмотреть/разобрать его, независимо от того, заработало у Вас Ваше решение или нет.
Это очень эффективный подход, т.к. разбирать решения опытных разработчиков может быть на порядок полезнее, чем сделать свое кое-как. Особенно, если Вы только что днями ломали голову, ища способ все сделать хорошо, быстро и красиво.

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

Процесс регистрации на стажировку
(«Стажировка» -> «Отправить заявку») далее скачиваете задание.
Решаете, заполняете все формы, нажимаете «Отправить заявку».
После того, как Вы отправить заявку на стажировку, на карте квестов (http://javarush.ru/quests) статус стажировки будет «Проходится»:
Вы отправили заявку на стажировку
После этого я рассматриваю Вашу заявку.
1. Если у Вас нет подписки, которая дает право проходить стажировку — я напишу Вам на e-mail об этом.
2. Если у меня будут замечания по Вашему решению — я напишу Вам на e-mail об этом.
3. Если все хорошо — я принимаю Вас на стажировку. При этом у Вас изменится статус на странице javarush.ru/me/profile на «Стажируюсь»:
Вы приняты на стажировку
Указывайте правильный почтовый адрес, так как Вам на почту придет письмо с дальнейшими инструкциями.

Для тех, кто продолжает пользоваться сайтом JavaRush 1.0, Вы можете подать заявку как через старый сайт, так и через новый.

Если будут вопросы по тестовому, задавайте в этом топике.

Заявки на стажировку будут рассматриваются 2-3 раза в неделю в зависимости от количества заявок.
  • ,

Простое переключение между версиями JavaRush

Как известно, создатели проекта, пошли на безпрецидентный шаг и «услышав» голос учащихся, а по сути заказчиков(коллективный разум), все-таки вернули первую версию(прежде всего предсказуемую). В связи с этим возникает новая проблема: тем, кто хочет делать задачи в первой версии и пробовать силы(дебажить) в новой. Как же сделать переход с одной версии на другую более комфортно? Все-таки каждый раз править файл hosts и искать подходящий плагин не очень удобно, да и отнимает время.
Вот, и я озадачился этой проблемой, вспомнил о выполняемых файлах в Windows. Посидев вчера ночью в «тырнете», нашел необходимую информацию. В итоге на рабочем столе имеется две пиктограммы с сылками на bat-файлы. Когда мне необходимо запустить нужную версию, я просто кликаю по соответствующему ярлыку и выбираю соответствующий проект(рисунок 4).
Вот несколько изображений как это выглядит:

1.Содержимое but-файлов

bat fails

2.Содержимое пиктограмм



3.Папка Пользователя где сожержится текущий плагин

Мои документы

4.Выбираем папку с соответствующим проектом

project

5.Создаем константы в «ПЕРЕМЕННЫХ СРЕДАХ»

properties

6.Пример файлов hosts

hosts

Поскольку командная строка не любит кирилицу, да и для понимания значений путей, которые указаны в файлах, я создал соответственные константы(рисунок 5), которые в bat-файле окружены двумя знаками процента, например: %constant%. Пробелы так же коммандная строка не воспринимает, потому нужно заключать их в двойные кавычки: "". bat-файлы у вас будут такие же, как у меня, если используете IDEA для 64-разрядной Windows. А в константах указываете соответственный путь к необходимым файлам. Перед первым запуском, я удалил плагины(рисунок 3) «JavaRush» с «Моих документов», чтобы там всегда был файл с одинаковым названием "IdeaPlugin.jar".

P.S.: Так же обязательно, чтобы применились измения hosts-файла, bat-файлы нужно запускать с правами «Администратора», либо «поправить» в файле полный доступ для текущего пользователя.
  • ,

соответствие задач 1.0 и 2.0 Java Core Quest



		        2.0			1.0 уровни 11-20(включительно)
	1 уровень
		6 лекция
			task11.task1101		level11.lesson06.task01
			task11.task1102		level11.lesson06.task02
			task11.task1103		level11.lesson06.task03
			task11.task1104		level11.lesson06.task04
			task11.task1105		level11.lesson06.task05
		8 лекция
			task11.task1106		level11.lesson08.task01
			task11.task1107		level11.lesson08.task02
			task11.task1108		level11.lesson08.task03
			task11.task1109		level11.lesson08.task04
			task11.task1110		level11.lesson08.task05
		11 лекция
			task11.task1111		level11.lesson11.home01
			task11.task1112		level11.lesson11.home02
			task11.task1113		level11.lesson11.home03
			task11.task1114		level11.lesson11.home04
			task11.task1115		level11.lesson11.home05
			task11.task1116		level11.lesson11.home06
			task11.task1117		level11.lesson11.home07
			task11.task1118		level11.lesson11.home08
			task11.task1119		level11.lesson11.home09
			task11.task1120		level11.lesson11.home10
			task11.task1121		level11.lesson11.bonus01
			task11.task1122		level11.lesson11.bonus02
			task11.task1123		level11.lesson11.bonus03
	2 уровень
		2 лекция
			task12.task1201		level12.lesson02.task01
			task12.task1202		level12.lesson02.task02
			task12.task1203		level12.lesson02.task03
			task12.task1204		level12.lesson02.task04
			task12.task1205		level12.lesson02.task05
		4 лекция
			task12.task1206		level12.lesson04.task01
			task12.task1207		level12.lesson04.task02
			task12.task1208		level12.lesson04.task03
			task12.task1209		level12.lesson04.task04
			task12.task1210		level12.lesson04.task05
		6 лекция
			task12.task1211		level12.lesson06.task01
			task12.task1212		level12.lesson06.task02
			task12.task1213		level12.lesson06.task03
			task12.task1214		level12.lesson06.task04
			task12.task1215		level12.lesson06.task05
		9 лекция
			task12.task1216		level12.lesson09.task01
			task12.task1217		level12.lesson09.task02
			task12.task1218		level12.lesson09.task03
			task12.task1219		level12.lesson09.task04
			task12.task1220		level12.lesson09.task05
		12 лекция
			task12.task1221		level12.lesson12.home01
			task12.task1222		level12.lesson12.home02
			task12.task1223		level12.lesson12.home03
			task12.task1224		level12.lesson12.home04
			task12.task1225		level12.lesson12.home05
			task12.task1226		level12.lesson12.home06
			task12.task1227		level12.lesson12.home07
			task12.task1228		level12.lesson12.home08
			task12.task1229		level12.lesson12.home09
			task12.task1230		level12.lesson12.home10
			task12.task1231		level12.lesson12.bonus01
			task12.task1232		level12.lesson12.bonus02
			task12.task1233		level12.lesson12.bonus03
	3 уровень
		2 лекция
			task13.task1301		level13.lesson02.task01
			task13.task1302		level13.lesson02.task02
			task13.task1303		level13.lesson02.task03
			task13.task1304		level13.lesson02.task04
			task13.task1305		level13.lesson02.task05
			task13.task1306		level13.lesson02.task06
			task13.task1307		level13.lesson02.task07
			task13.task1308		level13.lesson02.task08
			task13.task1309		level13.lesson02.task09
			task13.task1310		level13.lesson02.task10
		4 лекция
			task13.task1311		level13.lesson04.task01
			task13.task1312		level13.lesson04.task02
			task13.task1313		level13.lesson04.task03
			task13.task1314		level13.lesson04.task04
		6 лекция
			task13.task1315		level13.lesson06.task01
		11 лекция
			task13.task1316		level13.lesson11.home01
			task13.task1317		level13.lesson11.home02
			task13.task1318		level13.lesson11.home03
			task13.task1319		level13.lesson11.home04
			task13.task1320		level13.lesson11.home05
			task13.task1321		level13.lesson11.home06
			task13.task1322		level13.lesson11.home07
			task13.task1323		level13.lesson11.home08
			task13.task1324		level13.lesson11.home09
			task13.task1325		level13.lesson11.home10
			task13.task1326		level13.lesson11.bonus01
			task13.task1327		level13.lesson11.bonus02
			task13.task1328		level13.lesson11.bonus03
	4 уровень
		2 лекция
			task14.task1401		level14.lesson02.task01
			task14.task1402		level14.lesson02.task02
		4 лекция
			task14.task1403		level14.lesson04.task01
			task14.task1404		level14.lesson04.task02
			task14.task1405		level14.lesson04.task03
			task14.task1406		level14.lesson04.task04
			task14.task1407		level14.lesson04.task05
		6 лекция
			task14.task1408		level14.lesson06.01
		8 лекция
			task14.task1409		level14.lesson08.home01
			task14.task1410		level14.lesson08.home02
			task14.task1411		level14.lesson08.home03
			task14.task1412		level14.lesson08.home04
			task14.task1413		level14.lesson08.home05
			task14.task1414		level14.lesson08.home06
			task14.task1415		level14.lesson08.home07
			task14.task1416		level14.lesson08.home08
			task14.task1417		level14.lesson08.home09
			task14.task1418		level14.lesson08.home10
			task14.task1419		level14.lesson08.bonus01
			task14.task1420		level14.lesson08.bonus02
			task14.task1421		level14.lesson08.bonus03
	5 уровень
		2 лекция
			task15.task1501		level15.lesson02.task01
			task15.task1502		level15.lesson02.task02
			task15.task1503		level15.lesson02.task03
			task15.task1504		level15.lesson02.task04
			task15.task1505		level15.lesson02.task05
		4 лекция
			task15.task1506		level15.lesson04.task01
			task15.task1507		level15.lesson04.task02
			task15.task1508		level15.lesson04.task03
			task15.task1509		level15.lesson04.task04
			task15.task1510		level15.lesson04.task05
		6 лекция
			task15.task1511		level15.lesson06.task01
			task15.task1512		level15.lesson06.task02
			task15.task1513		level15.lesson06.task03
		9 лекция
			task15.task1514		level15.lesson09.task01
			task15.task1515		level15.lesson09.task02
			task15.task1516		level15.lesson09.task03
			task15.task1517		level15.lesson09.task04
			task15.task1518		level15.lesson09.task05
		12 лекция
			task15.task1519		level15.lesson12.home01
			task15.task1520		level15.lesson12.home02
			task15.task1521		level15.lesson12.home03
			task15.task1522		level15.lesson12.home04
			task15.task1523		level15.lesson12.home05
			task15.task1524		level15.lesson12.home06
			task15.task1525		level15.lesson12.home07
			task15.task1526		level15.lesson12.home08
			task15.task1527		level15.lesson12.home09
			task15.task1528		level15.lesson12.home10
			task15.task1529		level15.lesson12.bonus01
			task15.task1530		level15.lesson12.bonus02
			task15.task1531		level15.lesson12.bonus03
	6 уровень
		3 лекция
			task16.task1601		level16.lesson03.task01
			task16.task1602		level16.lesson03.task02
			task16.task1603		level16.lesson03.task03
			task16.task1604		level16.lesson03.task04
			task16.task1605		level16.lesson03.task05
		5 лекция
			task16.task1606		level16.lesson05.task01
			task16.task1607		level16.lesson05.task02
			task16.task1608		level16.lesson05.task03
			task16.task1609		level16.lesson05.task04
			task16.task1610		level16.lesson05.task05
		7 лекция
			task16.task1611		level16.lesson07.task01
			task16.task1612		level16.lesson07.task02
			task16.task1613		level16.lesson07.task03
			task16.task1614		level16.lesson07.task04
			task16.task1615		level16.lesson07.task05
		10 лекция
			task16.task1616		level16.lesson10.task01
			task16.task1617		level16.lesson10.task02
			task16.task1618		level16.lesson10.task03
			task16.task1619		level16.lesson10.task04
			task16.task1620		level16.lesson10.task05
		13 лекция
			task16.task1621		level16.lesson13.home01
			task16.task1622		level16.lesson13.home02
			task16.task1623		level16.lesson13.home03
			task16.task1624		level16.lesson13.home04
			task16.task1625		level16.lesson13.home05
			task16.task1626		level16.lesson13.home06
			task16.task1627		level16.lesson13.home07
			task16.task1628		level16.lesson13.home08
			task16.task1629		level16.lesson13.home09
			task16.task1630		level16.lesson13.home10
			task16.task1631		level16.lesson13.bonus01
			task16.task1632		level16.lesson13.bonus02
			task16.task1633		level16.lesson13.bonus03
	7 уровень
		2 лекция
			task17.task1701		level17.lesson02.task01
			task17.task1702		level17.lesson02.task02
		4 лекция
			task17.task1703		level17.lesson04.task01
			task17.task1704		level17.lesson04.task02
			task17.task1705		level17.lesson04.task03
			task17.task1706		level17.lesson04.task04
			task17.task1707		level17.lesson04.task05
		6 лекция
			task17.task1708		level17.lesson06.task01
			task17.task1709		level17.lesson06.task02
		10 лекция
			task17.task1710		level17.lesson10.bonus01
			task17.task1711		level17.lesson10.bonus02
			task17.task1712		level17.lesson10.bonus03
			task17.task1713		level17.lesson10.home01
			task17.task1714		level17.lesson10.home02
			task17.task1715		level17.lesson10.home03
			task17.task1716		level17.lesson10.home04
			task17.task1717		level17.lesson10.home05
			task17.task1718		level17.lesson10.home06
			task17.task1719		level17.lesson10.home07
			task17.task1720		level17.lesson10.home08
			task17.task1721		level17.lesson10.home09
			task17.task1722		level17.lesson10.home10
	8 уровень
		3 лекция
			task18.task1801		level18.lesson03.task01
			task18.task1802		level18.lesson03.task02
			task18.task1803		level18.lesson03.task03
			task18.task1804		level18.lesson03.task04
			task18.task1805		level18.lesson03.task05
		5 лекция
			task18.task1806		level18.lesson05.task01
			task18.task1807		level18.lesson05.task02
			task18.task1808		level18.lesson05.task03
			task18.task1809		level18.lesson05.task04
			task18.task1810		level18.lesson05.task05
		8 лекция
			task18.task1811		level18.lesson08.task01
			task18.task1812		level18.lesson08.task02
			task18.task1813		level18.lesson08.task03
			task18.task1814		level18.lesson08.task04
			task18.task1815		level18.lesson08.task05
		10 лекция
			task18.task1816		level18.lesson10.home01
			task18.task1817		level18.lesson10.home02
			task18.task1818		level18.lesson10.home03
			task18.task1819		level18.lesson10.home04
			task18.task1820		level18.lesson10.home05
			task18.task1821		level18.lesson10.home06
			task18.task1822		level18.lesson10.home07
			task18.task1823		level18.lesson10.home08
			task18.task1824		level18.lesson10.home09
			task18.task1825		level18.lesson10.home10
			task18.task1826		level18.lesson10.bonus01
			task18.task1827		level18.lesson10.bonus02
			task18.task1828		level18.lesson10.bonus03
	9 уровень
		3 лекция
			task19.task1901		level19.lesson03.task01
			task19.task1902		level19.lesson03.task02
			task19.task1903		level19.lesson03.task03
			task19.task1904		level19.lesson03.task04
			task19.task1905		level19.lesson03.task05
		5 лекция
			task19.task1906		level19.lesson05.task01
			task19.task1907		level19.lesson05.task02
			task19.task1908		level19.lesson05.task03
			task19.task1909		level19.lesson05.task04
			task19.task1910		level19.lesson05.task05
		8 лекция
			task19.task1911		level19.lesson08.task01
			task19.task1912		level19.lesson08.task02
			task19.task1913		level19.lesson08.task03
			task19.task1914		level19.lesson08.task04
			task19.task1915		level19.lesson08.task05
		10 лекция
			task19.task1916		level19.lesson10.bonus01
			task19.task1917		level19.lesson10.bonus02
			task19.task1918		level19.lesson10.bonus03
			task19.task1919		level19.lesson10.home01
			task19.task1920		level19.lesson10.home02
			task19.task1921		level19.lesson10.home03
			task19.task1922		level19.lesson10.home04
			task19.task1923		level19.lesson10.home05
			task19.task1924		level19.lesson10.home06
			task19.task1925		level19.lesson10.home07
			task19.task1926		level19.lesson10.home08
			task19.task1927		level19.lesson10.home09
			task19.task1928		level19.lesson10.home10
	10 уровень
		2 лекция
			task20.task2001		level20.lesson02.task01
			task20.task2002		level20.lesson02.task02
			task20.task2003		level20.lesson02.task03
			task20.task2004		level20.lesson02.task04
			task20.task2005		level20.lesson02.task05
		4 лекция
			task20.task2006		level20.lesson04.task01
			task20.task2007		level20.lesson04.task02
			task20.task2008		level20.lesson04.task03
			task20.task2009		level20.lesson04.task04
			task20.task2010		level20.lesson04.task05
		7 лекция
			task20.task2011		level20.lesson07.task01
			task20.task2012		level20.lesson07.task02
			task20.task2013		level20.lesson07.task03
			task20.task2014		level20.lesson07.task04
			task20.task2015		level20.lesson07.task05
		10 лекция
			task20.task2016		level20.lesson10.home01
			task20.task2017		level20.lesson10.home02
			task20.task2018		level20.lesson10.home03
			task20.task2019		level20.lesson10.home04
			task20.task2020		level20.lesson10.home05
			task20.task2021		level20.lesson10.home06
			task20.task2022		level20.lesson10.home07
			task20.task2023		level20.lesson10.home08
			task20.task2024		level20.lesson10.home09
			task20.task2025		level20.lesson10.bonus01
			task20.task2026		level20.lesson10.bonus02
			task20.task2027		level20.lesson10.bonus03
                      end.

думаю, многим понадобится при поиске на этом сервисе))
  • ,

Онлайн-стажировка: зимний набор

Внимание!!! Кому на почту не пришло письмо с приглашением на онлайн-стажировку, или кто не может добавиться в Slack — напишите мне в личном сообщении

Внимание!!! Набор на зимнюю онлайн стажировку закончен.
Ориентировочно следующий набор начнется в феврале 2017 года.


Good News, Everyone!
С радостью сообщаем вам, что начался очередной набор на онлайн стажировку!

С сегодняшнего для набором на стажировку буду заниматься я (silent) вместо Fry.

У вас есть уникальная возможность получить опыт в работе с такими технологиями: Git, Spring, Spring MVC, Spring Security, Hibernate, JPA, Junit, JSP, JSTL, ORM, REST, Bootstrap, AJAX и jQuery.
Конечно, за 12 недель слишком глубоко все это не выучить, но, во-первых, вы сможете указать эти технологии в своем резюме, а во-вторых, очень вероятно, что за эти 12 недель вы узнаете о программировании больше, чем 5 лет универа. Выбор за вами.

Записывайтесь, только если сможете уделять обучению 6-8 часов в неделю. Отзывы предыдущих участников можно почитать тут.

Условия участия:
У вас есть подписка Internship, Mentor или Premium Project
Ваш уровень на JavaRush 30 или выше
Вы выполнили тестовое задание

Если ваш уровень ниже 30-го, но хотя бы 25+, вы можете попробовать дойти до 30-го уровня. Набор на онлайн-стажировку будет продолжаться до 25 ноября, так что месяц у вас есть.

Если у вас нет подписки Internship/Mentor, то, возможно, самое время ее купить или проапгрейтить, если у вас уже есть другая Premium-подписка.

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

Онлайн стажировка – это отличный способ получить практический опыт (за ваши деньги).

Где можно записаться:

Оставьте свои контактные данные в разделе «МОЯ СТРАНИЦА, Реальный проект». Так же вам надо прислать ссылку на выполненное тестовое задание.

Тестовое задание надо выполнить обязательно. Если вы не в состоянии справится с тестовым заданием, значит вам будет не по силам половина заданий онлайн-стажировки. Лучше порешайте задачи на JavaRush – они в разы проще.

Следующая стажировка планируется через 3 месяца – не справились с тестовым заданием в этот раз – значит справитесь в следующий. Лучше день потерять, потом за пять минут долететь.

Участвовать в онлайн-стажировке можно только один раз.

Сроки:
Стажировка длится 12 недель.
Набор открыт до 25 ноября, старт самой стажировки – 1 декабря.
После 25 ноября заявки приниматься не будут – будете ждать следующей стажировки (март 2017 года).

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

Проект рассчитан на 12 недель (3 месяца). Каждую неделю вы будете изучать очередную технологию и добавлять очередной кусок функциональности к вашему проекту.

План обучения и список изучаемых технологий можно посмотреть здесь.

Формат занятий
В начале каждой недели вы будете получать видеозапись урока (длиной 2-3 часа!), на которой разбирается и объясняется очередная технология, а также дается задание на дом, которое вы должны сделать за неделю. Задания средней сложности. Если в первый день вы во всем разобрались, то сделайте его за 1-2 дня. Если сразу не поняли, то в неделю должны вложиться.

Правильное решение
Через неделю куратор стажировки выкладывает свое решение, и вы можете посмотреть/разобрать его, независимо от того, заработало у вас ваше решение или нет.
Это очень эффективный подход, т.к. разбирать решения опытных разработчиков может быть на порядок полезнее, чем сделать свое кое-как. Особенно, если вы только что днями ломали голову, ища способ все сделать хорошо, быстро и красиво.

Поддержка
В слаке будет создана отдельная группа, где вы и другие участники стажировки в режиме реального времени можете задавать вопросы и получать ответы от руководителя стажировки. Он может давать комментарии по изучаемой технологии, по своему решению и по своему коду. Но не по вашему коду :P

Процесс регистрации на стажировку
(Моя Страница -> Реальный проект) далее скачиваете задание.
Решаете, заполняете все формы, нажимаете Сохранить и потом Зарегистрироваться.

Указывайте правильный почтовый адрес
После проверки Вашего задания. Результат будет выслан Вам на почту, туда же и приглашение в слак.
Если будут вопросы по тестовому, задавайте в этом топике.
  • ,

Уровень 26. Ответы на вопросы к собеседованию по теме уровня. Часть 2. Вопросы 6-9, 11-12

6. Что такое канкаренси?

Concurrency – это библиотека классов в Java, в которой собрали специальные классы, оптимизированные для работы из нескольких нитей. Эти классы собраны в пакете java.util.concurrent. Их можно схематично поделить по функциональному признаку следующим образом:


Concurrent Collections — набор коллекций, более эффективно работающие в многопоточной среде нежели стандартные универсальные коллекции из java.util пакета. Вместо базового враппера Collections.synchronizedList с блокированием доступа ко всей коллекции используются блокировки по сегментам данных или же оптимизируется работа для параллельного чтения данных по wait-free алгоритмам.

Queues — неблокирующие и блокирующие очереди с поддержкой многопоточности. Неблокирующие очереди заточены на скорость и работу без блокирования потоков. Блокирующие очереди используются, когда нужно «притормозить» потоки «Producer» или «Consumer», если не выполнены какие-либо условия, например, очередь пуста или перепонена, или же нет свободного «Consumer»'a.

Synchronizers — вспомогательные утилиты для синхронизации потоков. Представляют собой мощное оружие в «параллельных» вычислениях.

Executors — содержит в себе отличные фрейморки для создания пулов потоков, планирования работы асинхронных задач с получением результатов.

Locks — представляет собой альтернативные и более гибкие механизмы синхронизации потоков по сравнению с базовыми synchronized, wait, notify, notifyAll.

Atomics — классы с поддержкой атомарных операций над примитивами и ссылками.

Источник:
habrahabr.ru/company/luxoft/blog/157273/

7. Какие классы из «канкаренси» ты знаешь?

Ответ на этот вопрос отлично изложен в этой статье. Смыла перепечатывать всю её сюда я не вижу, поэтому приведу описания только тех классов, с которыми имел честь вскользь ознакомиться.

ConcurrentHashMap<K, V> — В отличие от Hashtable и блоков synhronized на HashMap, данные представлены в виде сегментов, разбитых по hash'ам ключей. В результате, для доступа к данным лочится по сегментам, а не по одному объекту. В дополнение, итераторы представляют данные на определенный срез времени и не кидают ConcurrentModificationException.

AtomicBoolean, AtomicInteger, AtomicLong, AtomicIntegerArray, AtomicLongArray — Что если в классе нужно синхронизировать доступ к одной простой переменной типа int? Можно использовать конструкции с synchronized, а при использовании атомарных операций set/get, подойдет также и volatile. Но можно поступить еще лучше, использовав новые классы Atomic*. За счет использования CAS, операции с этими классами работают быстрее, чем если синхронизироваться через synchronized/volatile. Плюс существуют методы для атомарного добавления на заданную величину, а также инкремент/декремент.

8. Как устроен класс ConcurrentHashMap?

К моменту появления ConcurrentHashMap Java-разработчики нуждались в следующей реализации хэш-карты:
  • Потокобезопасность
  • Отсутствие блокировок всей таблицы на время доступа к ней
  • Желательно, чтобы отсутствовали блокировки таблицы при выполнении операции чтения
Основные идеи реализации ConcurrentHashMap следующие:

1. Элементы карты

В отличие от элементов HashMap, Entry в ConcurrentHashMap объявлены как volatile. Это важная особенность, также связанная с изменениями в JMM.

static final class HashEntry<K, V> {
    final K key;
    final int hash;
    volatile V value;
    final HashEntry<K, V> next;

    HashEntry(K key, int hash, HashEntry<K, V> next, V value) {
        this .key = key;
        this .hash = hash;
        this .next = next;
        this .value = value;
     }

    @SuppressWarnings("unchecked")
    static final <K, V> HashEntry<K, V>[] newArray(int i) {
        return new HashEntry[i];
    }
}


2. Хэш-функция

В ConcurrentHashMap также используется улучшенная функция хэширования.
Напомню, какой она была в HashMap из JDK 1.2:
static int hash(int h) {
    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}

Версия из ConcurrentHashMap JDK 1.5:
private static int hash(int h) {
    h += (h << 15) ^ 0xffffcd7d;
    h ^= (h >>> 10);
    h += (h << 3);
    h ^= (h >>> 6);
    h += (h << 2) + (h << 14);
    return h ^ (h >>> 16);
}

В чём необходимость усложнения хэш-функции? Таблицы в хэш-карте имеют длину, определяемую степенью двойки. Для хэш-кодов, двоичные представления которых не различаются в младшей и старшей позиции, мы будем иметь коллизии. Усложнение хэш-функции как раз решает данную проблему, уменьшая вероятность коллизий в карте.

3. Сегменты

Карта делится на N различных сегментов (16 по умолчанию, максимальное значение может быть 16-битным и представлять собой степень двойки). Каждый сегмент представляет собой потокобезопасную таблицу элементов карты. Увеличение количества сегментов будет способствовать тому, что операции модификации будут затрагивать различные сегменты, что уменьшит вероятность блокировок во время выполнения.

4. ConcurrencyLevel

Данный параметр влияет на использование картой памяти и количество сегментов в карте.
Количество сегментов будет выбрано как ближайшая степень двойки, большая чем concurrencyLevel. Занижение concurrencyLevel ведёт к тому, что более вероятны блокировки потоками сегментов карты при записи. Завышение показателя ведёт к неэффективному использованию памяти.

Если лишь один поток будет изменять карту, а остальные будут производить чтение — рекомендуется использовать значение 1.

Итого

Итак, основные преимущества и особенности реализации ConcurrentHashMap:
  • Карта имеет схожий с hashmap интерфейс взаимодействия
  • Операции чтения не требуют блокировок и выполняются параллельно
  • Операции записи зачастую также могут выполняться параллельно без блокировок
  • При создании указывается требуемый concurrencyLevel, определяемый по статистике чтения и записи
  • Элементы карты имеют значение value, объявленное как volatile

Источник: habrahabr.ru/post/132884/

9. Что такое класс Lock?

Для управления доступом к общему ресурсу в качестве альтернативы оператору synchronized мы можем использовать блокировки. Функциональность блокировок заключена в пакете java.util.concurrent.locks.

Вначале поток пытается получить доступ к общему ресурсу. Если он свободен, то на поток на него накладывает блокировку. После завершения работы блокировка с общего ресурса снимается. Если же ресурс не свободен и на него уже наложена блокировка, то поток ожидает, пока эта блокировка не будет снята.

Классы блокировок реализуют интерфейс Lock, который определяет следующие методы:

  • void lock(): ожидает, пока не будет получена блокировка
  • boolean tryLock(): пытается получить блокировку, если блокировка получена, то возвращает true. Если блокировка не получена, то возвращает false. В отличие от метода lock() не ожидает получения блокировки, если она недоступна
  • void unlock(): снимает блокировку
  • Condition newCondition(): возвращает объект Condition, который связан с текущей блокировкой

Организация блокировки в общем случае довольно проста: для получения блокировки вызывается метод lock(), а после окончания работы с общими ресурсами вызывается метод unlock(), который снимает блокировку.

Объект Condition позволяет управлять блокировкой.

Как правило, для работы с блокировками используется класс ReentrantLock из пакета java.util.concurrent.locks. Данный класс реализует интерфейс Lock.

Рассмотрим использование Java Lock API на примере небольшой программы:
И так, пусть у нас есть класс Resource с парочкой потокобезопасных методов и методов, где потокобезопасность не требуется.
public class Resource {
 
    public void doSomething(){
        // пусть здесь происходит работа с базой данных 
    }
     
    public void doLogging(){
        // потокобезопасность для логгирования нам не требуется
    }
}

А теперь берем класс, который реализует интерфейс Runnable и использует методы класса Resource.
public class SynchronizedLockExample implements Runnable{
 
    // экземпляр класса Resource для работы с методами
    private Resource resource;
     
    public SynchronizedLockExample(Resource r){
        this.resource = r;
    }
     
    @Override
    public void run() {
        synchronized (resource) {
            resource.doSomething();
        }
        resource.doLogging();
    }
}

А теперь перепишем приведенную выше программу с использованием Lock API вместо ключевого слова synchronized.
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
// класс для работы с Lock API. Переписан с приведенной выше программы,
// но уже без использования ключевого слова synchronized
public class ConcurrencyLockExample implements Runnable{
 
    private Resource resource;
    private Lock lock;
     
    public ConcurrencyLockExample(Resource r){
        this.resource = r;
        this.lock = new ReentrantLock();
    }
     
    @Override
    public void run() {
        try {
            // лочим на 10 секунд
            if(lock.tryLock(10, TimeUnit.SECONDS)){
            resource.doSomething();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            //убираем лок
            lock.unlock();
        }
        // Для логгирования не требуется потокобезопасность
        resource.doLogging();
    }
 
}

Как видно из программы, мы используем метод tryLock(), чтобы убедиться в том, что поток ждет только определенное время. Если он не получает блокировку на объект, то просто логгирует и выходит.

Еще один важный момент. Необходимо использовать блок try-finally, чтобы убедиться в том, что блокировка будет снята, даже если метод doSomething() бросит исключение.

Источники:
metanit.com/java/tutorial/8.9.php
prologistic.com.ua/java-lock-teoriya-i-primer-ispol-zovaniya-concurrency-lock.html

11. Что такое mutex?

Мютекс – это специальный объект для синхронизации нитей/процессов. Он может принимать два состояния – занят и свободен. Если упростить, то мютекс – это boolean-переменная, которая принимает два значения: занят(true) и свободен(false).

Когда нить хочет монопольно владеть некоторым объектом, она помечает его мютекс занятым, а когда закончила работу с ним – помечает его мютекс свободным.

Мютекс прикреплен к каждому объекту в Java. Прямой доступ к мютексу есть только у Java-машины. От программиста он скрыт.

12. Что такое монитор?

Монитор – это специальный механизм (кусок кода) – надстройка над мютексом, который обеспечивает правильную работу с ним. Ведь мало пометить, что объект – занят, надо еще обеспечить, чтобы другие нити не пробовали воспользоваться занятым объектом.

В Java монитор реализован с помощью ключевого слова synchronized.

Когда мы пишем блок synchronized, то компилятор Java заменяет его тремя кусками кода:
  1. В начале блока synchronized добавляется код, который отмечает мютекс как занятый.
  2. В конце блока synchronized добавляется код, который отмечает мютекс как свободный.
  3. Перед блоком synchronized добавляется код, который смотрит, если мютекс занят – то нить должна ждать его освобождения.


Часть 1.