Вот видео: 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;