Многопоточный тестовый центр

Java

1. В чем разница между потоком и процессом?

  1. Адресное пространство:Потоки одного и того же процесса совместно используют адресное пространство процесса, а сам процесс является независимым адресным пространством.
  2. На ресурсе есть:Потоки в одном процессе совместно используют ресурсы процесса, такие как память, ввод-вывод, процессор и т. д., но ресурсы между процессами независимы.
  3. Надежность:После сбоя процесса он не повлияет на другие процессы в защищенном режиме, но если происходит сбой потока, весь процесс умирает. Таким образом, многопроцессорность более надежна, чем многопоточность.
  4. представление:Когда процесс переключается, потребление ресурсов велико, а эффективность высока. Поэтому, когда дело доходит до частого переключения, лучше использовать потоки, чем процессы. Точно так же, если параллельные операции должны выполняться в одно и то же время, а некоторые переменные должны быть общими, можно использовать только потоки, а не процессы.
  5. Процесс реализации:Каждый независимый процесс имеет запись выполнения программы, последовательную последовательность выполнения и запись программы. Однако потоки не могут выполняться независимо и должны зависеть от прикладной программы, а прикладная программа обеспечивает управление выполнением нескольких потоков.
  6. Основные отличия:Поток — это основная единица планирования процессора, а процесс — нет.

2. Поток и работающий

  1. Подходит для нескольких потоков одного и того же программного кода для обработки одного и того же ресурса
  2. Ограничения одиночного наследования в java можно избежать.
  3. Увеличьте надежность программы, код может совместно использоваться несколькими потоками, код и данные независимы.

3. Возвращаемое значение потока

  1. основной поток ожидает
  2. Метод соединения потока
  3. Вызываемый интерфейс: FutureTask или приобретение пула потоков

Реализация вызываемого интерфейса:


import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception{
        String value="test";
        System.out.println("Ready to work");
        Thread.currentThread().sleep(5000);
        System.out.println("task done");
        return  value;
    }

}
  1. БудущееЗадание:
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class FutureTaskDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> task = new FutureTask<String>(new MyCallable());
        new Thread(task).start();
        if(!task.isDone()){
            System.out.println("task has not finished, please wait!");
        }
        System.out.println("task return: " + task.get());

    }
}
  1. Получение пула потоков
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        Future<String> future = newCachedThreadPool.submit(new MyCallable());
        if(!future.isDone()){
            System.out.println("task has not finished, please wait!");
        }
        try {
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } finally {
            newCachedThreadPool.shutdown();
        }
    }
}

4. Статус потока

  1. New
  2. Runnable
  3. Waiting
  4. Timed Waiting
  5. Blocked
  6. Terminated

5. Спать и ждать?

  1. сон не освобождает блокировку, ожидание освобождает объект
  2. sleep — метод Thread, wait — метод Object.

6. Блокировать пул и ждать пул?

  1. блокировка пула:Предполагая, что поток A уже владеет блокировкой объекта, поскольку B и C хотят вызвать синхронизированный метод этого объекта, объекты B и C войдут в пул блокировок.
  2. пул ожидания:После того, как поток A вызывает wait(), A снимает блокировку с объекта и входит в пул ожидания для объекта.

7. уведомить и уведомить всех?

  1. notifyAll позволит всем потокам, ожидающим в пуле, войти в пул блокировок, чтобы конкурировать за возможности блокировки.
  2. уведомление заключается в случайном выборе одного

8. yield означает выпуск процессора

9. функция прерывания

  1. Заброшенная функция: стоп
  2. Прерывание должно уведомить поток о том, что его необходимо прервать.Если поток заблокирован, поток выдаст InterruptedException
  3. Установите флаг в значение true, если поток активен. Прерванный поток будет продолжать выполняться без изменений.

10. Переходы между состояниями потока

synchronized

блокировка объекта

  1. это в синхронизированном блоке
  2. Синхронизация нестатических методов

блокировка класса

  1. Блок синхронизированного кода class.class
  2. Синхронизированный статический метод

возвращающийся

Тот же объект входит в тот же ресурс

Спин-блокировки и адаптивные спин-блокировки

  1. Блокировка вращения: позволяя потоку выполнять цикл занятости и ждать освобождения блокировки, не отказываясь от процессора (чем дольше блокировка занята, тем больше потребляется производительность, поэтому будет ограничение на количество вращений. )
  2. Адаптивная блокировка вращения: установить количество раз самостоятельного выбора непросто, и адаптивная блокировка вращения будет решать, вращать или нет в соответствии с последним временем вращения.

Снятие блокировки:

Определяйте контекст и удаляйте блокировки, которые вряд ли будут оспариваться

блокировка огрубления

Благодаря диапазону блокировки повторная блокировка и разблокировка уменьшаются.

Четыре состояния синхронизированы

Направление расширения блокировки: нет блокировки --> смещенная блокировка --> облегченная блокировка --> усиленная блокировка.

  1. Предвзятая блокировка: если поток получает блокировку, блокировка переходит в режим смещения, что может сохранить операцию применения блокировки.
  2. Облегченная блокировка: альтернативное выполнение потока
  3. Тяжелый замок:

Семантика памяти замков

  1. Освобождение блокировки: модель памяти Java сбрасывает локальные переменные, соответствующие потоку, в основную память.
  2. Получение блокировки: локальная память, соответствующая потоку, будет аннулирована, и критический раздел должен прочитать общую переменную из основной памяти.

Разница между sycronized и ReentryLock

  1. Справедливая блокировка: порядок получения блокировок соответствует порядку последовательного вызова метода блокировки.
  2. Несправедливые блокировки: преимущественный порядок не обязательно

happens-before

  1. порядок программы
  2. запирание
  3. volatile
  4. перечислить
  5. начало потока
  6. прерывание потока
  7. завершение потока
  8. завершение объекта

Пессимистическая блокировка и оптимистичная блокировка

  1. Пессимистическая блокировка всегда предполагает конфликт
  2. Оптимистическая блокировка обнаруживается только при отправке данных (CAS, J.U.C)