对比synchronized与java.util.concurrent.locks.Lock 的异同
主要区别
1、Lock能完成几乎所有synchronized的功能,并有一些后者不具备的功能,如公平锁、等待可中断、锁绑定多个条件等;
2、synchronized 是Java 语言层面的,是内置的关键字;Lock 则是JDK 5中出现的一个包,在使用时,synchronized 同步的代码块可以由JVM自动释放;Lock需要程序员在finally块中手工释放,如果不释放,可能会引起难以预料的后果。
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁。
public class Test implements Runnable{ public synchronized void get(){ System.out.println(Thread.currentThread().getId()); set(); } public synchronized void set(){ System.out.println(Thread.currentThread().getId()); } @Override public void run() { get(); } public static void main(String[] args) { Test ss=new Test(); new Thread(ss).start(); new Thread(ss).start(); new Thread(ss).start(); } }
两个例子最后的结果都是正确的,即 同一个线程id被连续输出两次
结果如下:
Threadid: 8 Threadid: 8 Threadid: 10 Threadid: 10 Threadid: 9 Threadid: 9
可重入锁最大的作用是避免死锁。