스레드 및 스레드 풀

7104 단어
스레드 동기화
왜 스레드 동기화
  • 우리가 여러 개의 라인이 변수나 대상에 동시에 접근할 때 이 라인에 읽기와 쓰기가 있을 때 변수 값이나 대상의 상태가 혼란스러워져 프로그램 이상을 초래할 수 있다.
  • 동기화 중단 코드
  • public class Bank {  
        private int count =0;//     
     
        //    
        public void addMoney(int money){  
            count += money;  
            System.out.println(System.currentTimeMillis()+"  :"+money);  
        }  
        //    
        public void subMoney(int money){  
            if(count-money < 0){  
                System.out.println("    ");  
                return;  
            }  
            count -=money;  
            System.out.println(+System.currentTimeMillis()+"  :"+money);  
        }  
        //    
        public void lookMoney(){  
            System.out.println("    :"+count);  
        }  
    }~~~
    
    #####        1 --     
    

    synchronized 키워드로 수식하는 방법.자바의 모든 대상에 내장 자물쇠가 있기 때문에 이 키워드로 수식할 때
              。       ,       ,         。
    

    synchronized 키워드도 정적 방법을 수식할 수 있습니다. 이 정적 방법을 사용하면 클래스 전체를 잠글 수 있습니다.
    public class Bank {private int count=0;//계정 잔액//입금 public synchronized addmoney(int money) {--synchronized 수식 방법 count+=money; System.out.println(System.currentTime Millis) +'입금:'+ money);//인출public synchronized void subMoney(int money) {--synchronized 수식 방법if(count-money < 0) {System.out.println(잔액 부족);return;count -=money; System.out.println(+System.currentTimeMillis() + 꺼내기:+money);}//public void lookMoney () {System.out.println ("계정 잔액:"+count);} ~~
    멀티스레드 동기화 방법2 - 코드 블록 동기화
    ### synchronized         。                    ,      。
    ###            ,             。            ,
          synchronized           。
    
    public class Bank {  
        private int count =0;//      
        //    
        public void addMoney(int money){  
            synchronized (this) {    -- synchronized     
                count +=money;  
            }  
            System.out.println(System.currentTimeMillis()+"  :"+money);  
        }  
        //    
        public void subMoney(int money){  
            synchronized (this) {    -- synchronized     
                if(count-money < 0){  
                    System.out.println("    ");  
                    return;  
                }  
                count -=money;  
            }  
            System.out.println(+System.currentTimeMillis()+"  :"+money);  
        }  
        //    
        public void lookMoney(){  
            System.out.println("    :"+count);  
        }  
    }~~~
    
    #####        3 -- Volatile
    
    - volatile                   。
    -   volatile                       。
    -               ,           。
    - volatile          ,        final     。
    
    -          :  volatile           ,  volatile    synchronized。  volatile           ,           。            volatile              ,         ,                  。        。
    

    결과가 동기화되지 않음
    public class Bank {private volatile int count = 0;//계정 잔액 -volatile 코스메틱 변수//입금 public void addmoney (int money) {count + = money; System.out.println (System.currentTime Millis () + "저장:"+ money)인출public void subMoney(int money) {if(count - money <0) {시스템.out.println(잔액 부족);return;count -= money; System.out.println(+System.currentTimeMillis() + 꺼내기:+ money);}//public void lookMoney () {System.out.println ("계정 잔액:"+ count);} ~~
    Java 멀티스레드 동기화 방법4 - Lock 잠금
  • Reentrant Lock류는 다시 들어갈 수 있고 서로 밀어낼 수 있으며 Lock 인터페이스를 실현할 수 있는 자물쇠로sunchronized 방법과 방법 블록을 사용하는 것과 같은 기본 행위와 의미를 가지며 그 능력을 확장시켰다.
  • ReenreantLock 클래스에서 자주 사용하는 방법은 다음과 같습니다.
  • ReentrantLock ():ReentrantLock 실례lock 만들기 (): 잠금 가져오기 (): 잠금 해제 ReentrantLock () 는 공평한 잠금을 만들 수 있는 구조 방법이 하나 더 있지만 프로그램 운영 효율을 대폭 낮출 수 있기 때문에 사용을 권장하지 않습니다.
  • sunchronized 키워드가 사용자의 요구를 충족시킬 수 있다면synchronized를 사용하십시오. 코드를 간소화할 수 있기 때문입니다.더 높은 기능이 필요하면 Reentrant Lock 클래스를 사용합니다. 이 때 자물쇠를 제때에 풀어야 합니다. 그렇지 않으면 사라진 자물쇠가 나타납니다. 보통finally 코드에서 자물쇠를 풀어줍니다.
  • public class Bank {  
        private  int count = 0;//       
        //         
        private Lock lock = new ReentrantLock();  
        //     
        public void addMoney(int money) {  
            lock.lock();//    
            try{  
            count += money;  
            System.out.println(System.currentTimeMillis() + "  :" + money);  
            }finally{  
                lock.unlock();//    
            }  
        }  
        //     
        public void subMoney(int money) {  
            lock.lock();  
            try{  
            if (count - money < 0) {  
                System.out.println("    ");  
                return;  
            }  
            count -= money;  
            System.out.println(+System.currentTimeMillis() + "  :" + money);  
            }finally{  
                lock.unlock();  
            }  
        }  
        //     
        public void lookMoney() {  
            System.out.println("    :" + count);  
        }  
    }~~~
    
    ##### Java       5 --     
    -     :   ,   
    - **ThreadLocal  **:    ThreadLocal    ,                     ,        ,                     ,            。--              ,             ,        。
    - **ThreadLocal     **:ThreadLocal                          
    -     “     ”   ,    “     ”   
    

    public class Bank { private static ThreadLocal count = new ThreadLocal(){ @Override protected Integer initialValue() {//TODO Auto-generated method stub return 0; } };//입금public void addMoney(int money) {count.set(count.get()+money), System.out.println(System.currentTime Millis()+"입금:"+ money),}//인출public void subMoney(int money) {if(count.get()-money <0) {System.out.println(잔액 부족);return;count.set(count.get()- money); System.out.println(+System.currentTimeMillis() + 꺼내기:+ money);}//public void lookMoney () {System.out.println ("계정 잔액:"+ count.get ();}운행 효과: 잔액 부족 계좌 잔액: 0 잔액 부족 계좌 잔액: 0 1441794247939 예금: 100 계좌 잔액: 100 잔액 부족 1441794248940 예금: 100 계좌 잔액: 0 계좌 잔액: 200 잔액 부족 계좌 잔액: 0 1441794249941 예금: 100 계좌 잔액: 300~~~
    Java의 네 가지 스레드 풀
    분류하다
  • newCachedThreadPool(가변 사이즈의 스레드 풀): 캐시 스레드 풀을 만듭니다. 스레드 풀의 길이가 처리 수요를 초과하면 빈 스레드를 유연하게 회수할 수 있고 회수할 수 없으면 새 스레드를 만듭니다.스레드 탱크는 무한대입니다. 두 번째 임무를 수행할 때 첫 번째 임무가 완성되면 첫 번째 임무를 수행하는 스레드를 다시 사용합니다. 새 스레드를 만들 때마다 사용하지 않습니다.
  • newFixedThreadPool(고정된 크기의 라인 풀): 라인의 최대 병발 수를 제어할 수 있는 정장 라인 풀을 만듭니다. 초과된 라인은 대기열에서 기다립니다.긴 라인 풀의 크기는 시스템 자원에 따라 설정하는 것이 가장 좋다.런타임처럼.getRuntime().availableProcessors().
  • newScheduledThreadPool(지연 라인 풀): 정해진 시간 및 주기적인 작업 수행을 지원하는 정해진 라인 풀을 만듭니다.
  • new Single Thread Executor (단일 작업 스레드 탱크): 단일 스레드 탱크를 만듭니다. 유일한 작업 스레드로만 작업을 수행할 수 있고 모든 작업이 지정한 순서(FIFO, LIFO, 우선순위)에 따라 실행될 수 있습니다.

  • 스레드 탱크의 역할
  • 스레드 탱크의 역할은 시스템에서 실행되는 스레드의 수량을 제한하는 것이다.
  • 스레드를 생성하고 제거하는 횟수를 줄이고 각 스레드를 재사용할 수 있으며 여러 작업을 수행할 수 있으며 스레드 풀의 작업 스레드 수를 조절하여 과도한 메모리로 인해 서버를 엎드리지 않도록 한다(스레드당 1MB 이상의 메모리가 필요하고 스레드가 많이 켜질수록 소모되는 메모리도 커지고 마지막에는 다운됨)
  • new Thread의 단점
  • 매번 new Thread에서 새 객체의 성능이 떨어집니다.
  • 라인이 통일된 관리가 부족하여 무제한으로 신설 라인을 만들고 서로 경쟁할 수 있으며 시스템 자원을 너무 많이 차지하여 oom을 초래할 수 있다.
  • 정시 집행, 정기 집행, 라인 중단 등 더 많은 기능이 부족하다.

  • 스레드 풀의 이점:
  • 존재하는 라인을 중용하여 대상의 창설, 판매 비용을 줄이고 성능이 좋다.
  • 최대 합병 루트 수를 효과적으로 제어하고 시스템 자원의 사용률을 높일 수 있으며 과도한 자원 경쟁을 피하고 막힘을 피할 수 있다.
  • 는 정시 집행, 정기 집행, 단일 라인, 병발수 제어 등의 기능을 제공한다.
  • 좋은 웹페이지 즐겨찾기