В этой статье в основном демонстрируется многопоточный сценарий параллельной обработки Java, посредством примера того, как пользователи банка снимают деньги, следующим образом.
Начните с примера: реализовать пример кода для сценария снятия средств банковского счета.
Первый класс: account.java
Категория учетной записи:
пакет cn.edu.byr.test; public class account {private String accountno; частный двойной баланс; public account () {} public account (String Account, Double Balance) {this.Accountno = accountno; this.balance = balance;} public int hashcode () {return account.hashcode ();} public getAccode () {return account.Ashcode ();} public String getAccode () {) {) {) {) {) {) {) {). double getBalance () {return this.balance;} public void setbalance (двойной баланс) {this.balance = balance;} public boolean equals (Object obj) {if (this == obj) вернуть true; if (obj! target.getAccountno (). equals (accountno);} вернуть false;}} Второй класс: drawthread.java
Класс снятия денег:
пакет cn.edu.byr.test; открытый класс DrawThread Extends Thread {частная учетная запись; частная двойная притяжение; public DrawThread (String name, учетная запись, Double Drawamount) {super (имя); this.account = account; this.drawamount = drawamount;} public void run () {// synchronized (accourct (account (account.getbalance. DrawAmount) {System.out.println (getName () + "Получите деньги успешно, выплюйте банкноты:" + draitAmount); // try {// thread.sleep (1); //} // catch (прерывание Exception e) {// e.printstacktrace (); //} account.setBalance (account.getBalance () - DrawAmount); System.out.println ("/t баланс:" + account.getBalance ());} else System.out.println (getName () + "Get Leaking Money не удалось, баланс недостаточен!"); //}} public static void main (String [] args) {account acct = новый счет ("123456", 1000); Drawthread ("a", acct, 800) .start (); new Drawthread ("b", acct, 800) .start ();}} Прокомментированная часть в приведенном выше коде: (1) Блок кода синхронизации (2) Поток. Если (1) и (2), есть много возможностей для результата прогона, одна из возможностей (вероятность невелика), которая соответствует нормальной логике:
B успешно снимает деньги, выплевывает деньги: 800.0
Баланс: 200,0
Неудачный уход и баланс был недостаточным!
Должно быть, B сначала находит ресурс снятия денег и правильно изменяет баланс, прежде чем начать судить о балансе пользователя; Эта вероятность очень мала, и большинство операций будут аналогичны следующим ситуациям:
Успешно снимает деньги и выплевывает деньги: 800.0
B успешно снимает деньги, выплевывает деньги: 800.0
Баланс: -600.0
Баланс: 200,0
Это явно нелогично. Из результатов, мы можем догадаться, что сначала захватывает ресурс и снимает сумму, но перед изменением баланса ресурс захвачен B; Поскольку баланс не был изменен, B видит, что баланс все еще 800, и B все еще снимает сумму; Первый запускает баланс модификации, но не печатает его, B вырывает ресурс; B модифицирует баланс и печатает баланс, который составляет -600; Печать баланса, который составляет 200;
Если (2) потоки спит, это должно быть условием ошибки, потому что A или B выпустит ресурсы процессора из -за сна после получения суммы, а JVM вызовет другие процессы в состоянии готового состояния. Второе - это снять деньги и судить о том, что баланс должен быть неправильным.
Если (1) синхронизированный синхронизированный кодовый блок добавляется, учетная запись заблокирована в теле метода запуска потока; тогда логика выполнения будет гарантированно будет нормальной каждый раз:
Успешно снимает деньги и выплевывает деньги: 800.0
Баланс: 200,0
B не удалось снять деньги, и баланс был недостаточным!
Вы можете представить процесс выполнения:
Первый преодолевает ресурс и первоначально блокирует класс учетной записи в корпусе метода запуска; затем начинает выполнять блок синхронного кода; Если он выполняется по определенной ссылке в середине, ресурс процессора предварительно проведен B; B начинает выполнять и блокирует класс учетных записей в начале. Однако при добавлении блокировки вы обнаружите, что учетная запись была занята A, и она будет скорректирована в состояние блокировки и ждат, пока A выпустит ресурс; После того, как A выполнила блок синхронного кода, будет выпущена блокировка учетной записи, и B продолжит выполнять; Баланс, наблюдаемый во время запуска B, гарантированно будет изменен A и будет выполняться нормально в соответствии с правильной логикой.
Суммировать
Выше приведено все содержание этой статьи об анализе многопоточных экземпляров программирования Java, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!