synchronized 키워드에 대한 이해

1939 단어
1. 위 코드:
package com.finger.gates.myapplication;
public class JavaStudy {  
  private static Thread a, b;   
 public static void main(String[] args) {    
    MyRunnable r = new MyRunnable();       
 a = new Thread(r, "1");    
    b = new Thread(r, "2");    
    a.start();
//                    
   b.start();    }  

 static class MyRunnable implements Runnable {         
@Override  
    
  public void run() {     
       if (Thread.currentThread().getName().equals("1")) {                synchronized (a) {       
             try {                  
      Thread.sleep(500);        
            } catch (InterruptedException e) {                        e.printStackTrace();                    }       
             synchronized (b) {            
            System.out.println("11111");    
                }                }            }         
   if (Thread.currentThread().getName().equals("2")) {                
synchronized (b) {              
      try {                        Thread.sleep(500);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }           
         synchronized (a) {               
         System.out.println("2222");                    }                }            }        }    }}

2. myrunner류를 분석해 본다.처음에 두 개의thread를 정의한 다음에 방법을 실행합니다.라인 1이 실행될 때 먼저 a를 잠그고 그를 잠들게 한 다음에 b를 잠그기;동시 스레드 2는 스레드 1과 반대되는 일을 한다.그러나synchronized의 효과는 실행 방법 과정에서 현재 대상이 잠겨 있기 때문에 라인 1이 잠긴 후에 라인 2를 잠그려고 할 때 2가 다른 라인에 잠긴 것을 발견하는 것이다.반대편 라인2도 같은 상황을 만났는데 양쪽 모두 손을 놓으려 하지 않고 이렇게 소모되어 사라진 자물쇠를 만들었다.3. 해결 방안은 이러한 상황을 피하기 위해 자물쇠를 채울 때 입도가 비교적 큰 위치를 선택한다. 예를 들어run() 방법에 직접 놓는다면public synchronised void run() _ 이렇게 하면 된다. 물론 장면이 비교적 특수하면 다시 의논한다.4. 용도는 일반적으로 시스템급 응용 프로그램을 쓰는 상황에서만 접하는 것이 많다고 한다. 예를 들어 데이터베이스를 쓸 때 읽기만 하고 쓰기만 하는 것을 제어해야 한다.5. 이미지 비교에 대한 이해를 넓히는 것은 다섯 철학자가 밥을 먹는 이야기이다

좋은 웹페이지 즐겨찾기