简述synchronized和java.util.concurrent.locks.Lock的异同 ?
                                             参考答案:
                                         
                                        synchronized和java.util.concurrent.locks.Lock都是Java中用于控制多个线程对共享资源的访问的工具,以防止出现线程安全问题。它们都是可重入锁,即一个线程可以多次获得同一个锁。
相同点:
- 互斥性:两者都保证了在同一时刻只有一个线程可以执行被保护的代码块。
- 可重入性:无论是synchronized还是Lock,都允许同一个线程多次获取锁。
- 中断性:两者都支持线程中断,当一个线程在等待锁的过程中被中断,它会收到InterruptedException。
不同点:
- 等待可中断性:synchronized的等待/通知机制(wait/notify/notifyAll)是不可中断的,而Lock接口中提供了可以中断的等待/通知机制(Condition接口的await()和signal()方法)。
- 锁的释放:synchronized在发生异常时,会自动释放锁。而Lock则需要显式调用unlock()方法来释放锁,否则可能导致死锁。
- 锁的公平性:synchronized锁是非公平的,无法保证等待的线程按照它们等待的顺序获得锁。而Lock接口中的ReentrantLock类可以通过构造函数的参数来选择是否公平。
- 锁的获取:synchronized是自动获取和释放锁的,而Lock需要手动获取和释放锁,这提供了更大的灵活性。
- 尝试获取锁:Lock接口提供了tryLock()方法,这个方法会尝试获取锁,如果锁被其他线程占用,它会立即返回,不会阻塞当前线程。而synchronized没有提供这样的机制。
总的来说,synchronized是Java语言内置的锁机制,使用起来更简单,但是功能相对较少。而Lock接口提供了更多的灵活性和功能,适合更复杂的并发控制需求。