什么是锁?
锁就是控制堆共享资源的访问机制,它用于在多线程中防止多个线程或进程同时访问共享资源,导致数据的不一致性。
- Synchronized 锁是自动的,而Lock锁是手动创建删除的。
- Synchronized 锁内置的Java关键字,而Lock锁是一个类。
- Synchronized 锁 是可重入锁,不可中断线程,非公平锁;Lock锁 是可重入锁、可选中断线程,可设置锁是否公平。
- Synchronized 会自动释放线程,而Lock则需要手动释放,如果不设防线程--死锁
- Synchronized 锁中 线程1(获得锁,然后阻塞)线程2(一直等待);Lock锁不一定会等待下去
- Synchronized 锁适合少量的代码同步问题; Lock锁适合大量的同步代码;
Lock是Java.util.concurrent下的
Lock锁为什么可设置锁是否公平
public ReentrantLock() {
sync = new NonfairSync();
}
/**
* Creates an instance of {@code ReentrantLock} with the
* given fairness policy.
*
* @param fair {@code true} if this lock should use a fair ordering policy
*/
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
Lock锁为什么可以选择线程中断?
通过lockInterruptibly()方法,在程序抛出异常后终端程序。
public void sale() {
try {
lock.lockInterruptibly(); // 替换为可中断的加锁方式
try {
if (count > 0) {
System.out.println(Thread.currentThread().getName() + ": 卖出第" + (50 - count + 1) + "张票,剩余:" + (--count));
}
} finally {
lock.unlock();
}
} catch (InterruptedException e) {
// 处理中断异常
System.out.println(Thread.currentThread().getName() + " 被中断");
Thread.currentThread().interrupt(); // 保留中断状态
}
}