Вот видео:
https://www.youtube.com/watch?v=tdfFBpWw7gw&t=1458s
В нем описана работа синхронизации на конкретном примере.
Я сначала на свой лад делал похожий код и у меня каждый раз ничего не получалось. Тогда я полностью скопировал этот код и проблема осталась.
public class Main {
public static void main(String[] args) {
Solution solo = new Solution();
solo.start();
}
}
public class Solution {
private List<Integer>list1 = new ArrayList<>();
private List<Integer>list2 = new ArrayList<>();
private Random random = new Random();
private Object lock1 = new Object();
private Object lock2 = new Object();
private void partOne() {
synchronized (lock1) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
list1.add(random.nextInt(100));
}
}
private void partTwo() {
synchronized (lock2) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
list2.add(random.nextInt(100));
}
}
private synchronized void proceed (){
for (int i = 0; i < 1000; i++) {
partOne();
partTwo();
}
}
public void start() {
System.out.println("Начинаем...");
long startTime = System.currentTimeMillis();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
proceed();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
proceed();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("Потраченное время: " + (endTime - startTime));
System.out.println("list1 size" + list1.size());
System.out.println("list2 size" + list2.size());
}
}
Начинаем...
Потраченное время: 5763
list1 size2000
list2 size2000
Process finished with exit code 0
Суть проблемы у человека из видео без синхронизации получается 4 секунды на выполнение задачи у меня 5763. Почему больше на 1763, ведь должно же быть примерно ровно 4 секунды. Когда он настраивает синхронизацию потоков у него становится 2 секунды, а у меня ничего не меняется... У меня свежая, новая intellij idea. И это первая задача которая я решаю в ней. Не думаю, что проблема в ней. Это видео 2014 года, мб джава настолько медленней стала работать 😬. Как такое может быть у нас одинаковый код, а выполнение настолько разное..
В общем потратил уйму времени, переписал этот код в разных вариациях десятки раз. Понял, что я где-то скорее всего что-то не понимаю.
Буду рад помощи!
upd.
Перечитав код нашел решение проблемы синхронизации)
private synchronized void proceed
убрал synchronize
стал вывод
Начинаем...
Потраченное время: 2767
list1 size2000
list2 size2000
Process finished with exit code 0
меня больше волгует вопрос не синхронизации. А откуда появляется +767.
У человека из видео вывод
Потраченное время: 2000+-20;