Java基础-线程同步之Lock锁基础学习

线程同步之Lock锁基础学习

无论是 同步代码块还是同步方法 我们都只是理解上的 加锁解锁
根本不能很清晰的看到 哪里加了锁 哪里解锁

而Lock锁 就很清晰的能够看到加锁解锁代码

1.5推出 同步方式:Lock

Lock锁 里面被锁起来的代码一旦执行过程中出现代码报错,则永远不会自动释放锁,那么其他线程永远无法进入

而同步代码块会自动释放锁

所以我们想到了无论什么时候都必须执行lock.unLock()方法,所以Lock锁要使用必须结合try{}finally{}。
Demo.java

public class Demo {
    public static void main(String[] args) {
        SellTickets s1 = new SellTickets("窗口1");
        SellTickets2 s2 = new SellTickets2("窗口2");
        SellTickets2 s3 = new SellTickets2("窗口3");

        s1.start();
        s2.start();
        s3.start();
//在s1线程死掉之后,线程s2和s3线程不受影响继续执行
    }
}

SellTickets.java

public class SellTickets extends Thread {
    public static int tikets = 100;
    //保证锁对象唯一
    static Lock lock = new ReentrantLock();


    public SellTickets(String name) {
        super(name);
    }

    @Override
    public void run() {
        while(true){
            try {
                lock.lock();//加锁
                //synchronized (String.class) {
                if (tikets > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (tikets <= 50) {
                        //出发炸弹
                        String str = null;
                        System.out.println(str.charAt(5));
                    }
                    System.out.println(getName() + "--->正在售卖第:" + (tikets--) + "张票!");
                } else {
                    System.err.println(getName() + "--->停止售票!!");
                    break;
                }
            }finally {
                lock.unlock();//解锁
                   }
        }
        //}
    }
}

SellTicket.java

public class SellTickets2 extends Thread {
    public static int tikets = 100;
    //保证锁对象唯一
    //static Lock lock = new ReentrantLock();


    public SellTickets2(String name) {
        super(name);
    }

    @Override
    public void run() {
        while(true) {
            try {
                SellTickets.lock.lock();//加锁
                //synchronized (String.class) {
                if (SellTickets.tikets > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName() + "--->正在售卖第:" + (SellTickets.tikets--) + "张票!");
                } else {
                    System.err.println(getName() + "--->停止售票!!");
                    break;
                }
            }finally {
                SellTickets.lock.unlock();//解锁
                 }
            //}
        }
    }
}

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页