Абсолютно у всех ребят, кто готовит себя как Java Developer под моим менторством, нет или крайне мало опыта с многопоточность.
Поэтому я решил сделать серию заданий, выполнение которых будет максимально покрывать знания по базовому Multithreading и Concurrency.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | import java.util.ArrayList; import java.util.List; import org.junit.Test; /** * Есть счетчик, подсчитывающий количество вызовов. * * Почему счетчик показывает разные значения и не считает до конца? * Как это можно исправить не используя synchronized? * * Попробуйте закомментировать обращение к yield(). * Измениться ли значение? */ public class AtomicCounterTutor { int counter=0; class TestThread implements Runnable { String threadName; public TestThread(String threadName) { this.threadName = threadName; } @Override public void run() { for (int i=0;i<10000;i++) { counter++; Thread.yield(); } } } @Test public void testThread() { List<Thread> threads = new ArrayList<Thread>(); for (int i=0;i<100;i++) { threads.add(new Thread(new TestThread("t"+i))); } System.out.println("Starting threads"); for (int i=0;i<100;i++) { threads.get(i).start(); } try { for (int i=0;i<100;i++) { threads.get(i).join(); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Counter="+counter); } } |
Результат работы сейчас такой:
На компьютерах разной производительности результат разный, пробуйте увеличивать ко-во итераций или потоков.
Ожидаемый результат:
Тот, кто выполнит правильно абсолютно все задания — получит БЕСПЛАТНО месяц менторинга в пакете «Ментор-Padawan».
Задания будут появляться до 30 июля 2015.
- Решение нужно разместить в GitHub или BitBucket. (как раз подучите git)
- Ссылку на репозиторий опубликовать у себя в соц. сети (facebook или vk) c текстом: «»Решение задачи от BecomeJavaSenior».
- Ссылку на пост и объяснения, почему такое решение — отправить на becomejavasenior[at]gmail.com.
Ваше решение будет просмотрено, а все замечания — высланы в ответ.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.