-
时海
1、synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问;
2、synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3、synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4、用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
5、synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
6、Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
-
时海synchronized是Java内建的同步机制,它提供了互斥的语义和可见性。当一个线程已经获取当前锁时,其他试图获取的线程只能等待或阻塞在那里。
在java 5 以前,synchronized是仅有的同步手段。在代码中,synchronized可以修饰方法也可以用在特定的代码块上。本质上synchronized方法等价于把方法全部语句用synchronized块包起来。
ReentrantLock,通常翻译为再入锁。是Java5中提供的锁实现。语义与synchronized基本相同。再入锁通过代码直接调用lock()获取,书写更加灵活。同时ReentrantLock提供了很多实用的方法,能够实现很多synchronized无法做到的细节控制,比如控制fairness(公平性),但是必须要通过unlock()方法释放锁,不然会一直持有该锁。
所谓的再入是指当一个线程视图获取一个它已经获得的锁时,这个获取动作就自动成功,这是对锁获取粒度的一个概念。也就是锁的持有是以线程为单位而不是基于调用次数。
再入锁可以设置公平性fairness,这里的公平性是指当公平性为真时,会倾向于将锁赋予等待时间最久的线程。公平性是减少饥饿(个别进程长期等待锁、但始终无法获取)情况发生的一种方法.
如果使用synchronized,我们根本无法进行公平性的选择。但这也是主流操作系统调度的选择。通用场景下,公平性并没有想象的那么重要,Java默认的调度很少产生饥饿情况。此外引入公平性会导致吞吐量的下降。
ReentrantLock相比synchronized。因为可以像普通对象一样使用,可以利用其提供的各种便利方法,进行精细的同步操作,甚至是实现synchronized难以表达的用例。如:
- 带超时的获取锁请求
- 可以判断是否有线程在排队等待获取锁
- 可以响应中断请求
-
hadoop迷ReentrantLock是Lock的实现类,是一个互斥的同步器,在多线程高竞争条件下,ReentrantLock比synchronized有更加优异的性能表现。
1 用法比较
Lock使用起来比较灵活,但是必须有释放锁的配合动作
Lock必须手动获取与释放锁,而synchronized不需要手动释放和开启锁
Lock只适用于代码块锁,而synchronized可用于修饰方法、代码块等
ReentrantLock的优势体现在:
具备尝试非阻塞地获取锁的特性:当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁
能被中断地获取锁的特性:与synchronized不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放
超时获取锁的特性:在指定的时间范围内获取锁;如果截止时间到了仍然无法获取锁,则返回
3 注意事项
在使用ReentrantLock类的时,一定要注意三点:
在finally中释放锁,目的是保证在获取锁之后,最终能够被释放
不要将获取锁的过程写在try块内,因为如果在获取锁时发生了异常,异常抛出的同时,也会导致锁无故被释放。
ReentrantLock提供了一个newCondition的方法,以便用户在同一锁的情况下可以根据不同的情况执行等待或唤醒的动作。
-
Lock和synchronized有以下几点不同:
1、ReetrantLock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
2、synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
3、Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
4、通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
5、Lock可以提高多个线程进行读操作的效率。
在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。
6、Lock可以设置等待锁的时间,而synchronized不行
标签: synchronized、lock、竞争、等待、线程
笔试题
刷题
简历模板
AI算法
大数据
内推
内推: