day20Java-Thread-Lock 잠금 및 고정 잠금

16265 단어 JavaSE
블로거
Java- (고급)

문서 목록

  • Lock Lock Lock
  • 고정 잠금
  • Lock 자물쇠


    java.util.concurrent.locks
    비록 우리는 동기화 코드 블록과 동기화 방법의 자물쇠 대상 문제를 이해할 수 있지만 어디에 자물쇠를 달았는지, 어디서 자물쇠를 풀었는지 직접 보지 못했다. 자물쇠를 어떻게 달았는지, 풀었는지 더욱 명확하게 표현하기 위해 JDK5 이후에 새로운 자물쇠 대상 Lock을 제공했다.
    Lock:
    		void lock():  。
    		void unlock(): 。  
    ReentrantLock Lock 。
    

    코드 데모
    public class SellTicketDemo {
    
        public static void main(String[] args) {
            // 
            SellTicket st = new SellTicket();
    
            // Thread 
            Thread t1 = new Thread(st," 1");
            Thread t2 = new Thread(st," 2");
            Thread t3 = new Thread(st," 3");
    
            // 
            t1.start();
            t2.start();
            t3.start();
        }
    }
    

    사용자 정의 클래스 Runnable 인터페이스 구현
    public class SellTicket implements Runnable {
        // 100 
        private int ticket = 100;
        // Lock 
        Lock lock = new ReentrantLock();
    
        //Lock 
        @Override
        public void run() {
            while (true) {
                try {
    
    
                    // 
                    lock.lock();
                    if (ticket > 0) {
                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName() + " " + (ticket--) + " ");
    
                    }
                } finally {
                    // 
                    lock.unlock();
                }
            }
        }
    
        // 
        /*@Override
        public void run() {
            while (true){
                synchronized (this) {
                    if (ticket > 0) {
                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName() + " " + (ticket--) + " ");
    
                    }
                }
            }
        }*/
    }
    

    결과:
     1 10 
     1 9 
     3 8 
     3 7 
     3 6 
     3 5 
     3 4 
     3 3 
     3 2 
     3 1 
    

    고정 자물쇠

     :
    		A: 
    		B: 
    
     :
    		 , 。
    
     :
    		 , 。
    		 :
    			 : 
    			 : 
    		 :
    			 : 1 , 
    			 : 1 , 
    

    코드 데모
    public class DieLockDemo {
        public static void main(String[] args) {
    
            // 
            DieLock dl1 = new DieLock(true);
            DieLock dl2 = new DieLock(false);
    
            // 
            dl1.start();
            dl2.start();
        }
    }
    

    고정 잠금 코드 데모
    public class DieLock extends Thread{
    
        private boolean flag;
    
        public DieLock(boolean flag) {
            this.flag = flag;
        }
    
        // 
        @Override
        public void run() {
            if (flag) {
                synchronized (MyLock.objA) { // tl1, 。
                    System.out.println("if objA");
                    synchronized (MyLock.objB) {// tl2 , tl2 。
                        System.out.println("if objB");                     
                    }                                                                           
                }                                                 // , 。                  
            } else {
                synchronized (MyLock.objB) {// tl2, 。
                    System.out.println("else objB");
                    synchronized (MyLock.objA) {// tl1 , tl1 。
                        System.out.println("else objA");
                    }
                }
            }
        }
    }
    

    두 개의 자물쇠 정의
    public class MyLock {
        public static final Object objA = new Object();
        public static final Object objB=  new Object();
    }
    

    결과: 사라진 자물쇠가 나타났다(나타날 수 있음)
    else objB
    if objA
    

    좋은 웹페이지 즐겨찾기