Synchronized与Lock区别

文章目录

  • 1、具体区别(核心)
  • 2、在锁概念上的区别
  • 3、性能比较

1、具体区别(核心)

(1)synchronizedLock都是可重入锁,前者是jvm中使用monitorenter(1)monitorexit(2)来
实现同步且其中阻塞和唤醒是wait和notify,后者是juc包中的lock层次使用,依赖于AQS来实现加锁和解锁;
(2)synchronized是非公平锁,ReentrantLock可以设置公平锁或者非公平锁;
(3)synchronized是不可中断且无法获取锁状态,后者是可中断lockInterruptibly方法,同时也可获取锁的状态isLocked();
(4)synchronized是不能精准唤醒的,ReentrantLock是可以依赖于Condition对象设置条件进行精准唤醒;
(5)synchronized是jdk提供的关键字,Lock是普通的java类(接口),前者可锁方法或代码块,后者只能锁代码块;
(6)synchronized是不会产生死锁,lock使用lock()方法和unlock()方法成对使用,否则产生死锁;

2、在锁概念上的区别

(1)可中断锁
响应中断的锁,Lock是可中断锁(体现在lockInterruptibly()方法),synchronized不是。如果线程A正在执行锁中代码,
线程B正在等待获取该锁。时间太长,线程B不想等了,可以让它中断自己。
(2)公平锁
尽量以请求锁的顺序获取锁。比如同时有多个线程在等待一个锁,当锁被释放后,等待时间最长的获取该锁,跟京牌司法拍卖一个道理。
非公平锁可能会导致有些线程永远得不到锁,synchronized是非公平锁,ReentrantLock是公平锁。
(3)读写锁
读写锁将对一个资源(如文件)的访问分为2个锁,一个读锁,一个写锁;读写锁使得多个线程的读操作可以并发进行,不需同步。
而写操作就得需要同步,提高了效率ReadWriteLock就是读写锁,是一个接口,ReentrantReadWriteLock实现了这个接口。
可通过readLock()获取读锁,writeLock()获取写锁
(4)绑定多个条件
一个ReentrantLock可以绑定多个Condition对象,仅需多次调用new Condition()即可;而在synchronized中锁锁对象的wait()notify()/notifyAll()可以实现一个隐含的条件,如果要和多余的条件关联,就不得不额外的增加一个锁。

3、性能比较

大量线程同时竞争,ReentrantLock要远胜于synchronized(1)JDK5中,synchronized是性能低效的,因为这是一个重量级操作,对性能的最大影响是阻塞的实现,挂起线程和恢复线程的操作,
都需要转入内核态中完成,给并发带来了很大压力。
(2)JDK6中synchronized加入了自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁等一系列优化,官方也支持synchronized,
提倡在synchronized能实现需求的前提下,优先考虑synchronized来进行同步。

你可能感兴趣的:(总结类,JAVA锁,锁,synchronized,lock)