类锁与对象锁互不影响 * 不同对象的锁也互不影响 * 对象锁可以有多个 * 内置锁是一种特殊的对象锁,类对象创建的时候,就分配给一个内置锁 内置锁的可重入性: * 线程进入doSomething()方法时,此时拿到了LoggingWidget实例对象的锁,随后又调用了父类的doSomething(),它又是被synchronized修饰的 * 现在我们的LoggingWidget的锁还没有释放,进入父类的widget的doSomething()还需要一把锁吗? * 不需要的! * 因为锁的持有者是线程,而不是调用,线程A已经持有了LoggingWidget的实例对象的锁了,当再需要的时候,不需要再申请锁,而是直接可以进入的 * ,这就是内置锁的可重入性 * * * 锁释放的时机:1.当方法(代码块)执行完毕后会自动释放锁,不需要做任何的操作。 * 2.当一个线程执行的代码出现异常时,其所持有的锁会自动释放。 * 不会由于异常导致出现死锁现象~ Lock方式来获取锁支持中断、超时不获取、是非阻塞的 * 提高了语义化,哪里加锁,哪里解锁都得写出来 * Lock显式锁可以给我们带来很好的灵活性,但同时我们必须手动释放锁 * 支持Condition条件对象 * 允许多个读线程同时访问共享资源 公平锁: 线程将按照他们发出请求的顺序来获取锁 非公平锁: 线程获取锁的顺序与申请获取锁的顺序可以不同 Lock和synchronize都是默认使用非公平锁的。如果不是必要的情况下,不要使用公平锁 公平锁会来带一些性能的消耗的
测试:一个类里, A、B两个方法都加锁,C线程访问A的时候,D线程可以访问B吗 * <p> * 测试答案:需要确定A与B加的是否是同一种类型的锁,如果都加的类锁,或者都加的对象锁,那么C线程访问A的时候,D线程不能访问B * 如果持有的锁不同,那么是可以访问的。 */