Java 可重入锁 & 不可重入锁

Java 可重入锁 & 不可重入锁文章目录Java可重入锁&不可重入锁概述论证synchronized是可重入锁:论证Lock是可重入锁:自定义不可重入锁:Java可重入锁&不可重入锁概述可重入锁:指可以重复使用的同步锁。如:synchronized、Lock、ReentrantReadWriteLock.ReadLock、ReentrantReadWriteLock.WriteLock。不可重入锁:指不可以重复使用的同步锁。需要自定义锁。论证synchronized是可重入锁:publiccl

Java

Java 可重入锁 & 不可重入锁

概述

  • 可重入锁:指可以重复使用的同步锁。如:synchronized、Lock、ReentrantReadWriteLock.ReadLock、ReentrantReadWriteLock.WriteLock。
  • 不可重入锁:指不可以重复使用的同步锁。需要自定义锁。

论证synchronized是可重入锁:

public class Demo { 
   
    public static void main(String[] args) { 
   
        synchronized (Demo.class) { 
   
            System.out.println("第一次获取锁");
            synchronized (Demo.class) { 
   
                System.out.println("第二次获取锁");
            }
        }
    }
}

输出:

第一次获取锁
第二次获取锁

论证Lock是可重入锁:

public class Demo { 
   
    public static void main(String[] args) { 
   
        Lock lock = new ReentrantLock();
        lock.lock();
        try { 
   
            System.out.println("第一次获取锁");
            lock.lock();
            try { 
   
                System.out.println("第二次获取锁");
            } finally { 
   
                lock.unlock();
            }
        } finally { 
   
            lock.unlock();
        }
    }
}

输出:

第一次获取锁
第二次获取锁

自定义不可重入锁:

public class Demo { 
   
    public static void main(String[] args) { 
   
        MyLock lock = new MyLock();
        lock.lock();
        try { 
   
            System.out.println("第一次获取锁");
            lock.lock();
            try { 
   
                System.out.println("第二次获取锁");
            } finally { 
   
                lock.unlock();
            }
        } finally { 
   
            lock.unlock();
        }
    }
}

class MyLock implements Lock { 
   
    //绑定线程
    private Thread thread;

    @Override
    public void lock() { 
   
        synchronized (this) { 
   
            while (thread != null) { 
   
                try { 
   
                    wait();
                } catch (InterruptedException e) { 
   
                    e.printStackTrace();
                }
            }
            this.thread = Thread.currentThread();
        }
    }

    @Override
    public void lockInterruptibly() throws InterruptedException { 
   

    }

    @Override
    public boolean tryLock() { 
   
        return false;
    }

    @Override
    public boolean tryLock(long l, TimeUnit timeUnit) throws InterruptedException { 
   
        return false;
    }

    @Override
    public void unlock() { 
   
        synchronized (this) { 
   
            if (thread != Thread.currentThread()) { 
   
                return;
            }
            thread = null;
            notifyAll();
        }
    }

    @Override
    public Condition newCondition() { 
   
        return null;
    }
}

输出:

第一次获取锁

说明:只输出了一个打印信息,程序就进入等待阶段。

今天的文章Java 可重入锁 & 不可重入锁分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/27879.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注