스레드는 Java 프로그래밍에서 매우 중요한 개념입니다. 이 기사에서는 예제 형식으로 자세히 설명합니다. 구체적인 분석은 다음과 같습니다.
우선 스레드 잠금의 용도는 무엇입니까? 예를 들어, 현재 은행에 30,000위안이 있고 돈을 인출하기 위해 은행에 간다면 비밀번호를 입력한 후에는 이미 인출 금액을 입력한 것입니다. 예를 들어 20,000위안을 입력했다면, 그 때 당신의 아내도 돈을 인출하러 은행에 갔고 당신도 그 돈을 인출할 것이라는 뜻입니다. 귀하의 계좌가 현재 30,000이기 때문에 제 아내도 20,000을 인출하므로 은행은 귀하의 아내 측에서 동일한 작업을 수행합니다. 이런 식으로 두 사람이 각자의 작업을 완료한 후에도 은행에는 여전히 30,000이 귀하의 계좌에 기록되어 있어야 합니다. .보증금 10,000위안, 이거 대단하지 않나요? 이 문제를 해결하기 위해 스레드 잠금(Thread Locking)에 대한 지식을 활용해 보겠습니다.
1. 처리되지 않은 스레드 동기화의 예:
public class TextSync는 Runnable을 구현합니다.{ /**처리되지 않은 스레드 동기화* @param args */ Time time = new Time(); public static void main(String[] args) { TextSync text = new TextSync(); (텍스트); 스레드 t2 = new Thread(text); t1.setName("t1"); t1.start(); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()); }}class Time { private static int num = 0; try { num++; //첫 번째 스레드가 이 지점까지 실행되면 num이 1이 되고, 첫 번째 스레드가 이 지점까지 실행되면 두 번째 스레드가 실행을 시작합니다. 두 번째 스레드는 1초 동안 일시 중지됩니다. //이때 첫 번째 스레드의 num도 2가 되므로 최종 결과는 2입니다. Thread.sleep(1000) } catch (InterruptedException e) { e.printStackTrace() } System.out.println (name+ "는 "+num+"번째 실행 스레드입니다.") }}출력 결과:
t2는 두 번째 실행 스레드입니다. t1은 두 번째 실행 스레드입니다.
2. 스레드 동기화
public class TextSynctwo는 Runnable을 구현합니다{ /**스레드 동기화* @param args */ Time1 time = new Time1(); public static void main(String[] args) { TextSynctwo text = new TextSynctwo(); text); 스레드 t2 = new Thread(text); t1.setName("t1"); t1.start(); t2.start(); } @Override public void run() { time.add(Thread.currentThread().getName()) }}class Time1 { private static int num = 0; 동기화는 메소드가 정의될 때 선언되거나 메소드에 설정될 수 있는 현재 스레드를 잠급니다. public 동기화 void add(문자열 이름){ //synchronized (this) {//다른 스레드에 의해 실행되지 않도록 현재 스레드를 잠급니다. try { num++(1000) } catch (InterruptedException e); . printStackTrace(); } System.out.println(name+"는 "+num+"번째 실행 스레드입니다.");출력 결과:
t1은 실행의 첫 번째 스레드입니다. t2는 두 번째 실행 스레드입니다.
3. 교착상태
공용 클래스 TestDeadLock은 Runnable을 구현합니다{ /**Deadlock* @param args */ private int flag = 0; static Object o1 = new Object() static Object o2 = new Object() { TestDeadLock td1 = 새로운 TestDeadLock(); TestDeadLock td2 = 새로운 TestDeadLock(); = 1; td2.flag = 2; 스레드 t1 = new Thread(td2); t1.setName("t1"); t2.start() } @Override 공개 void run() { System.out.println(Thread.currentThread().getName()); if(flag == 1){ synced(o1){ try { Thread.sleep(5000) } catch (InterruptedException e) { e.printStackTrace( ); } 동기화(o2){ System.out.println("1") } } } if(flag == 2){ 동기화(o2){ 시도 { 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(); try { tt.m2() } catch(예외 e) { e.printStackTrace() } System.out.println(tt.b); } @Override public void run() { try { m1() } catch (Exception e) { e.printStackTrace() } } private synced void m1() 예외 발생 b = 1000; Thread.sleep(5000); System.out.println("b="+b) } 개인 동기화 void m2() 발생 예외{ Thread.sleep(2500); b = 2500 } ;이제 출력은 다음과 같습니다:
1000b=1000
m2가 먼저 실행되고 m2가 완료될 때까지 m1이 실행될 수 없음을 알 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍 설계에 도움이 되기를 바랍니다.