synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。JDK1.5以后引入了自旋锁、锁粗化、轻量级锁,偏向锁来有优化关键字的性能。
Lock:JDK5新增了 Lock接口和实现类ReentrantLock(重入锁),利用lock()【阻塞式】,tryLock()【非阻塞式】,lockInterruptibly()【获得了锁就返回,否则线程就休眠,知道获得锁】。
使用lock前先:
Lock lock = new ReentrantLock();
再用lock进行加锁(lock.lock())和释放锁(lock.unlock() )。
区别:
1、Synchronized可以加在方法上,也可以加载代码块上,而Lock要显式的制定起始位置,即lock()和unlock()。Synchronized是托管给JVM的,Lock的锁定是通过代码实现的。
2、竞争不激烈时,Synchronized性能优于ReentrantLock,竞争激烈时,Synchronized性能差。
3、Synchronized会自动释放锁,而Lock需要在finally块中手动释放锁。