Потоки — очень важная концепция в программировании на Java. В этой статье она будет подробно объяснена в виде примеров. Конкретный анализ заключается в следующем:
Прежде всего, какая польза от блокировки потока? Например: например, если у вас сейчас в банке 30 000 юаней, и вы идете в банк, чтобы снять деньги, после ввода пароля вы уже ввели сумму вывода. Например, если вы ввели 20 000, это будет. означает, что банк получит деньги для вас. В это время ваша жена тоже пошла в банк, чтобы снять деньги, и вы. Моя жена также снимает 20 000, потому что на вашем счете в настоящее время еще 30 000, поэтому банк выполняет ту же операцию со стороны вашей жены. Таким образом, после того, как вы двое выполните соответствующие операции, на вашем счету все еще должно быть записано 30 000. Залог в размере 10 000 юаней, разве это не здорово? Для решения этой проблемы используются знания о блокировке потоков. Давайте изучим это вместе.
1. Пример необработанной синхронизации потоков:
общедоступный класс TextSync реализует Runnable{ /**Необработанная синхронизация потоков* @param args */ Time time = new Time(); public static void main(String[] args) { TextSync text = new TextSync(); (текст); Thread t2 = новый поток (текст); t1.setName("t1"); t2.setName("t2"); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()); class Time {private static int num = 0; try { num++; //Когда первый поток выполняется до этой точки, num становится 1, и первый поток приостанавливается на одну секунду. //Когда второй поток выполняется до этой точки, num становится 2, и второй поток приостанавливается на одну секунду. //Номер первого потока в это время также становится равным 2, поэтому окончательный результат равен 2; Thread.sleep(1000); catch (InterruptedException e) { e.printStackTrace(); System.out.println (name+); " — это "+num+"-й поток выполнения." }}Результат вывода:
t2 — второй поток выполнения. t1 — второй поток выполнения.
2. Синхронизация потоков
общедоступный класс TextSynctwo реализует Runnable{ /**Синхронизация потоков* @param args */ Time1 time = new Time1(); текст); Поток t2 = новый поток (текст); t1.setName("t1"); t2.setName("t2"); t1.start(); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()); class Time1 { Private static int num = 0; Synchronized блокирует текущий поток, который может быть объявлен при определении метода или установлен в методе. publicsynced void add(String name){ //synchronized (this) {//Блокируем текущий поток, чтобы предотвратить его выполнение другими потоками try { num++; Thread.sleep(1000 } catch (InterruptedException e) { e); . printStackTrace(); } System.out.println(name+"это "+num+"-й поток выполнения." // }};Результат вывода:
t1 — первый поток выполнения. t2 — второй поток выполнения.
3. Тупик
общедоступный класс TestDeadLock реализует Runnable { /**Deadlock* @param args */ частный int flag = 0; new static Object o2 = new public static void main(String[] args) { TestDeadLock td1 = новый TestDeadLock(); TestDeadLock td2 = новый TestDeadLock(); = 1; td2.flag = 2; Поток t1 = новый поток (td1); Поток t2 = новый поток (td2); t1.setName("t1"); t2.setName("t2"); ; t2.start() } @Override public void run() {; System.out.println(Thread.currentThread().getName()); if(flag == 1){syncd(o1){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace( ); } синхронизирован(o2){ System.out.println("1" } } } if(flag == 2){); синхронизированный (o2) { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace() } синхронизированный (o1) { System.out.println("2");4. Блокировка
общедоступный класс TT реализует Runnable { /**Lock* @param args */ int b = 100; public static void main(String[] args) { TT tt = new TT(); .start(); попробуйте { tt.m2(); } catch (Исключение е) { e.printStackTrace(); System.out.println(tt.b); } @Override public void run() { try { m1(); } catch (Exception e) { e.printStackTrace(); } частный синхронизированный void m1() выдает исключение { b = 1000; Thread.sleep(5000); System.out.println("b="+b } частный синхронизированный void m2() выдает Исключение { Thread.sleep(2500); b = 2500 } };Теперь вывод:
1000b=1000
Видно, что m2 выполняется первым, а m1 не может быть выполнен до тех пор, пока не завершится m2.
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.