Synchronized关键字底层是使用monitor对象锁实现的,每一个对象关联一个monitor对象,而monitor对象可以看成是一个对象锁,它采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其他线程再想获取这个对 象锁时会被阻塞住,这样就能保证拥有锁的线程可以安全的执行临界区的代码。
Lock是一个接口,而synchronized是Java中的关键字,是内置的语言实现;Synchronized既可以加在方法上,也可以加在特定的代码块上,而Lock需要显示地指定起始位置和终止位置。
Synchronized相比于Lock,它的优点是:
Synchronized不需要用户手动去释放锁,当synchronized方法或者代码块执行完毕后,系统会自动让线程释放锁的占用,无论中途是否遇到异常都能自动释放;而Lock需要用户手动去释放,一般写在finally块中避免执行中途遇到异常无法正常释放锁。
缺点是:
- Lock可以被中断或设置超时等待,可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待锁的线程会一直等下去,不能响应中断。
- Lock可以设置公平锁,而synchronized只能是非公平实现(公平锁通过在锁竞争前判断自己是否是头节点来实现)。
- Lock可以支持多个条件变量(Condition),而synchronized只支持一个条件变量,所有的等待都在同一个waitset中。