一、synchronized
每一个对象都有一个锁(监视器)monitor
线程调用对象的synchronized方法活着访问synchronized代码块时,这个线程要先获取该对象的锁。
当一个线程正在访问一个对象的synchronized方法时,其他线程不能访问该对象的synchronized方法,因为没有该对象的锁
当一个线程正在访问一个对象的synchronized方法时,其他线程可以访问该对象的非synchronized方法,因为不需要获取该对象的锁。
不同对象具有不同的锁,两个线程可以同时访问两个不同对象的synchronized方法。
synchronized修饰class对象时,会获取该class对象的类锁,类锁是用来控制对静态变量的访问的。
两个线程不能同时访问该类的被synchronized修饰的静态方法。
两个线程可以同时分别访问该类的被synchronized静态方法和非静态方法。
因为访问静态方法获取的是类锁,访问非静态方法获取的是对象锁。
synchronized是可重入锁。
在执行synchronized方法或者synchronized代码块时,如果发生异常,JVM会自动释放当前线程占用的锁。
synchronized是java内置特性,是java语言的关键字
二、Lock
Lock不是Java语言的内置特性,而是一个用来实现同步访问的类。
Lock可以实现读锁和写锁的分离,可以实现并发读操作。
Lock可以尝试获取锁,无论有没有得到锁都会返回,而不会阻塞
Lock在获取锁的过程中可以响应中断。
Lock需要用户主动释放锁,建议在finally中释放锁。