1.原始构成
synchronized是关键字属于jvm层面;
monitorenter和monitorexit(底层是通过mointor对象来完成,其实wait/notify等方法也依赖monitor对象,所以只有在同 步代码块方法中才能调用wait/notify等方法)
lock是具体的类时api层面锁;
2.使用方法
synchronized不需要用户手动释放锁,当synchronized代码执行完成后系统会自动让线程释放对锁的占用;
Reentrantlock则需要手动去释放锁,如果没有手动释放锁就可能导致出现死锁现象;
需要lock()和unlock()方法配合try/finally语句块来完成
3.等待是否可中断
synchronized不可中断,除非抛出异常或者正常运行完成
Reentrantlock可中断,1.设置超时时间trylock(long timeout,timeunit unit),2.lockInterruptibly()放代码块中,调用 interrup()方法
4.加锁是否公平
synchronized非公平锁
Reentrantlock两者都可以,默认非公平锁,构造函数传true即为公平锁
5.锁绑定多个条件的condition
synchronized没有,要么只唤醒一个,要么所有都唤醒,不能精准唤醒
Reentrantlock通过condition可以实现精准唤醒某个线程
Synchronized和Lock的区别
最新推荐文章于 2025-03-29 22:58:59 发布