java鎖:第二章:可重入鎖和遞歸鎖

可重入鎖是什么?

可以防止死鎖,是同一把鎖

代碼:

    package com.javaliao.backstage;
     
    class Phone{
     
        public synchronized void sendSMS(){
            System.out.println(Thread.currentThread().getName()+"\t 發(fā)短信");
            sendEmail();
        }
        public synchronized void sendEmail(){
            System.out.println(Thread.currentThread().getName()+"\t 發(fā)郵件");
        }
    }
    public class Demo {
        public static void main(String[] args) {
            Phone phone = new Phone();
            new Thread(()->{
                phone.sendSMS();
            },"t1").start();
            new Thread(()->{
                phone.sendSMS();
            },"t2").start();
        }
    }

控制臺(tái):

生活案例:

家里的大門有一把鎖,廁所沒(méi)有上鎖。我進(jìn)了大門了,就不用在廁所上鎖了。

ReentrantLock就是把可重入鎖

    package com.javaliao.backstage;
     
     
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
     
    class Phone implements Runnable{
     
        Lock lock = new ReentrantLock();
        @Override
        public void run() {
            sendSMS();
        }
     
        public void sendSMS(){
            //加幾把就要解鎖幾次
            lock.lock();
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName()+"\t 發(fā)短信");
                sendEmail();
            } finally {
                lock.unlock();
                lock.unlock();
            }
        }
        public void sendEmail(){
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName()+"\t 發(fā)郵件");
            } finally {
                lock.unlock();
            }
        }
     
     
    }
    public class Demo {
        public static void main(String[] args) {
            Phone phone = new Phone();
            Thread t1 = new Thread(phone,"t1");
            Thread t2 = new Thread(phone,"t2");
            t1.start();
            t2.start();
        }
    }