1.synchronized是关键字,Lock是接口;
2.synchronized是隐式的加锁,lock是显式的加锁;
3.synchronized可以作用于方法上,lock只能作用于方法块;
4.synchronized底层采用的是objectMonitor,lock采用的AQS;
5.synchronized使用了object类的wait和notify进行等待和唤醒, lock使用了condition接口进行等待和唤醒(await和signal)。
1. 两者都是用来保护资源 ,线程安全的
都可以起到保护资源,不会因多线程修改而产生冲突的情况。
2. 可以保证可见性
可见性,说起来也简单,简单来说在解锁N之前的所有操作,对于加锁N之后的所有操作(包括其他线程的)都是可见的。
3. 都可重入
synchronized 和 ReentrantLock (Lock)都具备可重入性,可重入是指如果一个线程已经获取了一个锁,再试图获取这个锁,不需要释放,而是直接获取锁。如果不可重入是一个线程获取A锁之后,同一个线程如果想再次获取A锁,必须先释放后,才能再次获取A锁。