synchronized、Lock锁

Lock锁

可重入锁:ReentrantLock类

public class LockTest {

    public static void main(String[] args) {
        Test a = new Test("小红");
        new Thread(a).start();
        new Thread(a).start();
    }

    static class Test implements Runnable{

        int ticket = 10;
        String name;

        public Test(String name){
            this.name = name;
        }

        @Override
        public void run() {
//            synchronized (this){
//            }
            ReentrantLock lock = new ReentrantLock();
                try {
                    lock.lock();
                    while (ticket > 0) {
                        Thread.sleep(100);
                        System.out.println(this.name + ":拿到了第"+ticket--);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            }
        }
}

小红:拿到了第10
小红:拿到了第9
小红:拿到了第8
小红:拿到了第7
小红:拿到了第5
小红:拿到了第6
小红:拿到了第4
小红:拿到了第3
小红:拿到了第2
小红:拿到了第1

lock记得finally里面将lock.unlock();关闭

synchronized、lock

lock是显示锁(手动开启关闭)

synchronized是隐式锁,出了作用域自动释放锁;

lock只有代码块锁,synchronized有代码块锁、对象锁、方法锁;

lock锁,JVM花费时间更少,使用效率高,

synchronized锁使用范围更广;

优先顺序

lock > synchronized代码块 > synchronized方法锁;

死锁情况

产生死锁条件

1.互斥条件:一个资源每次只能被一个进程使用;

2.请求与保持条件:一个进程在获取其他资源阻塞时,并不释放自己占用的资源;

3.不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺;

4.循环等待条件:多个进程间形成一种头尾相接的循环等待资源关系;

public class SynchronizedTest implements Runnable{
    // static 修饰,保证资源只一份
    static JingZi jz = new JingZi();
    static KouHong kh = new KouHong();
    int number;
    String name;

    public SynchronizedTest(int number,String name){
        this.number = number;
        this.name = name;
    }
    @Override
    public void run() {
        getA();
    }
    public void getA(){
        if(number == 0){
            synchronized (jz){
                System.out.println(this.name + ":获得了镜子的锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (kh){
                    System.out.println(this.name + ":获得了口红的锁");
                }
            }
        }else{
            synchronized (kh){
                System.out.println(this.name + ":获得了口红的锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (jz){
                    System.out.println(this.name + ":获得了镜子的锁");
                }
            }
        }
    }
    static  class JingZi{}
    static class KouHong{}
    static class Test{
        public static void main(String[] args) {
            SynchronizedTest a = new SynchronizedTest(0,"AAA");
            SynchronizedTest b = new SynchronizedTest(1,"BBB");
            new Thread(a).start();
            new Thread(b).start();
        }
    }
}

AAA:获得了镜子的锁
BBB:获得了口红的锁

两个人一人占了一个锁,都没办法进行下一步;

posted @ 2022-01-04 19:18  窃窃私语QAQ  阅读(20)  评论(0编辑  收藏  举报