Краткое понимание разницы между процессами и потоками в операционной системе:
Процесс: Каждый процесс имеет независимый код и пространство данных (контекст процесса), а переключение между процессами будет иметь большие накладные расходы. Процесс содержит 1-N потоков. (Процесс - это наименьшая единица распределения ресурсов)
Тема: тот же тип потоков совместно использует код и пространство данных. Каждый поток имеет независимый работающий стек и счетчик программы (ПК), а переключение потока невелика. (Поток - наименьшая единица планирования процессора)
Как и процесс, потоки разделены на пять этапов: создание, готовое, бег, блокировка и завершение.
Многопроцесс означает, что операционная система может выполнять несколько задач (программы) одновременно.
Многопользовательский состав относится к нескольким последовательным потокам, выполняемым в одной и той же программе. Прежде всего, операция экономии денег и снятия денег должна быть резкой, и может быть много клиентов. Это означает, что должно быть несколько потоков, а несколько потоков совместно управляют банком, а сумма банка должна быть синхронизирована. Только обеспечивая безопасность нити.
Итак, давайте приведем этот пример этого кода здесь. Если что -то не так, укажите это. Потому что старик спросил об этом многопоточном коде.
Прежде всего, банк, создание этой объектной модели.
пакет com.lxk.threadtest.bank;/*** Банк модель, общая сумма атрибута. * <p> * * @author lxk 2017/6/26 */Public Class Bank {/** * Дайте банку стартовый капитал, иначе как вы можете вести бизнес. */private int sum = 200; // Это никогда не используется так, но это также правильный механизм блокировки: синхронизировать кодовые блоки. // объект obj = new Object (); /*** Сэкономьте деньги* Если вы не добавите [синхронизирован-синхронизированная функция], возникнут многопоточные проблемы безопасности. */public void add (int n) {// synchronized (obj) {sum = sum + n; try {thread.sleep (10);} catch (исключение игнорируется) {} // Когда количество времен экономии денег становится все больше, вы можете обнаружить, что сберегательные денежные потоки действительно два альтернативы выполняют сберегательное действие. System.out.println (think.currentThread (). GetName () + "... sum =" + sum); //}}/*** Снятие денег* Если вы не добавите [синхронизирован-синхронизированная функция], возникают проблемы с многопользованием безопасности. */public synchronized void crement (int n) {if (sum - n> = 0) {sum = sum - n;} else {System.out.println («Деньги банка недостаточно!»);} попробуйте {thread.slep (30);} Поймать (исключение проигнорировать) {} // Когда число сэкономив деньги, что вы можете найти, что вы можете найти в том, что сэкономить деньги, которые действительно вы можете найти, что, что, как и тем, что вы можете найти, что, что, как и тем, что вы можете найти в том, что все, что, как и в том, что сэкономить, что, что, как и в том, что вы можете найти тем, что все, что вы можете найти, что, что, как и в том, что сэкономить на том, что, по -настоящему, вы можете найти. Экономия денег. System.out.println (thread.currentThread (). GetName () + "... sum =" + sum);}}В коде есть два метода: Сохранить и получить, эти два метода и общая сумма, а также некоторые прокомментированные код. Это просто и легко понимать, многопоточно блокируя взаимоисключающие и обеспечивает синхронизацию между потоками.
Тем не менее, это редкий метод. Обычно используемый метод заключается в использовании синхронизированного ключевого слова для изменения метода синхронизации.
Модель клиентского объекта
Пакет com.lxk.threadtest.bank;/*** Клиент, реализовать интерфейс runnable (), и несколько человек могут сэкономить деньги вместе** @author lxk на 2017/6/26*/Общедоступный класс, внедряющий клиент, {/*** СОВЕТИЙ ТИП*/Статический окончательный строка Type_ADD = "ADD"; ** withDrawal Type*/static string string_rud_duce_duce_red = "/** withDrawal type*/static string stric Банк*/Частный банковский банк;/***Тип операции за деньги, экономия или снятие*/частная строка типа;/***Количество операций теоретически является положительным числом*/private int time;/***Как много сэкономить или снимать*/private int money; public cultip () {} public Bank, тип строки, int, int money) {this.bank = this. Time; this.money = money;}@переопределить public void run () {for (int x = 0; x <time; x ++) {if (type_add.equals (type)) {bank.add (money);} else if (type_reduce.equals (type)) {bank.reduce (money);}}}}}}}}}}}}}}}}}}}}}}}}}Как объект клиента, поскольку многие клиенты могут одновременно получить доступ к банку, операция экономии и снятия денег реализуется с использованием потоков.
Атрибут построен для прохождения значения.
Основной метод
пакет com.lxk.threadtest.bank;/** * Многопользованный экземпляр банковского депонирования денег * <p> * [Требования:] * Банк имеет хранилище. * Есть два вкладчика, которые депонируют или снимают n * 100 соответственно. * Цель: есть ли проблемы безопасности с этой программой? Если так, как это решить? * <p> * [Как найти проблему:] * 1. Очистить, какие коды представляют собой многопоточные коды. * 2. Четко обмениваться данными. * 3. Очистите, какие операторы в многопоточном коде работают по общим данным. * * @author lxk от 2017/6/26 */public class main {public static void main (string [] args) {// один банк и несколько клиентов Bank Bank = new Bank (); int time = 10000; int money = 100; // Этот клиент экономит деньги C1 = новый клиент (Bank, customer.type_add, время, деньги); Customer.type_reduce, time, money); поток t1 = новый поток (C1); поток T2 = новый поток (C2); t1.start (); t2.start ();}}Фактический эффект работы приведенного выше кода показан на рисунке ниже.
Если количество раз депозита и снятия денег мало, вы можете увидеть, что эти два потока имеют последовательность. Поэтому у нас больше раз. Затем мы увидим ситуацию, как показано на рисунке. Поток 1 снимает деньги, и когда потока 0 экономит деньги, вы можете видеть, что два потока выполняются, как с хранением, так и снятыми, и нет шаблона.
Это обеспечивает синхронизацию данных.
Что касается того, как быть вне синхронизации, то есть ненормальные явления,
Вы можете удалить синхронизированное ключевое слово метода добавления, уменьшить количество раз и изменить его до 3 раза и установить начальное значение суммы на 0. Попробуйте код снова,
Вы найдете так называемое асинхронное явление.
Результатом несинхронизации в правой части рисунка выше является то, что два человека экономят 100 каждый раз, три раза. Получено общее число? 100,200,300,400 500 600. Это занимает много времени.
Однако результат работы не
В настоящее время, если вы добавите синхронизированный в метод добавления, появится результат графика слева, что является правильным результатом.
Я добавил еще один метод для существования и снятия. Код становится тем, как он выглядит выше.
Это почти все примеры межпоточной синхронизации.
Я кратко запишу код. При использовании вы можете вытащить его за считанные минуты.
Суммировать
Выше приведено полный код этой статьи по моделированию проблемы с многопоточной синхронизацией Java с использованием банка снятия средств в качестве примера. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на этот сайт:
Пример программирования Java
Принцип и реализация таймера многопоточного таймера Java
Java понимает многопоточное, продавая билеты
Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!