首页 > 试题广场 >

ReentranceLock 和 synchroniz...

[问答题]
请简单介绍ReentranceLock 和 synchronized 有什么区别
1.  可重入性 字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0时才能释放锁 2 .  锁的实现 ReentrantLock是JDK实现的Synchronized是JVM实现  前者可以直接看到源码,后者实现难以看到 3.性能的区别 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。
发表于 2019-04-30 22:27:29 回复(0)
更多回答
1. 可重入性 字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0 时才能释放锁 2 . 锁的实现 ReentrantLock是JDK实现的 Synchronized 是JVM实现 前者可以直接看到源码,后者实现难以看到 3. 性能的区别 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。 4. 功能的区别 便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。 锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized 当你需要时候一下三种功能是需要使用ReentrantLock ReentranLock 可以指定公平锁还是非公平锁 (公共锁就是先等待的线程先获得锁) 实现自旋锁,通过循环调用CAS操作来实现加锁,性能比较好,避免进入内核态的线程阻塞。 提供了Condition类,可以分组唤醒需要唤醒的线程 提供能够中断等待锁的线程的机制,lock.lockInterruptibly()
发表于 2018-12-25 15:05:45 回复(0)
synchronized不可中断
发表于 2019-05-15 18:04:16 回复(0)
reentracelock(可重入锁)方便自己进行定义。1)公平锁,通过队列实现,先进先服务。2)非公平锁,新进入的线程有很大几率直接获得运行。
synchronized是用来标识,虚拟机在运行时会通过监视器来进行监视,由虚拟机自行优化。在引入偏向锁和轻量级锁(自旋锁)后执行效率提高。
发表于 2019-05-06 19:58:49 回复(0)
1.  可重入性 字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0时才能释放锁 2 .  锁的实现 ReentrantLock是JDK实现的Synchronized是JVM实现  前者可以直接看到源码,后者实现难以看到 3.性能的区别 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。 4.功能的区别 便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。  锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized 当你需要时候一下三种功能是需要使用ReentrantLock ReentranLock可以指定公平锁还是非公平锁  (公共锁就是先等待的线程先获得锁)  实现自旋锁,通过循环调用CAS操作来实现加锁,性能比较好,避免进入内核态的线程阻塞。 提供了Condition类,可以分组唤醒需要唤醒的线程 提供能够中断等待锁的线程的机制,lock.lockInterruptibly() 具体使用场景要根据实际的业务进行分析  使用Synchronized时不需要释放锁,jvm会帮助我们做释放锁的操作
发表于 2019-04-25 18:45:27 回复(0)
1. 可重入性 字面的意思就是可以再次进入的锁,synchronized其实也是可重锁,同一线程每进入一次,锁的计数器都会加一,在释放锁是计数器都会减一,只有当计数器为0时才能释放锁 2 . 锁的实现 ReentrantLock是JDK实现的Synchronized是JVM实现 前者可以直接看到源码,后者实现难以看到 3.性能的区别 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了,在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。
发表于 2019-04-25 18:24:45 回复(0)
Ly~头像 Ly~
存在层次上:java的关键字,在jvm层面 锁的释放:以获取锁的代码块执行完毕释放,若是异常,jvm则会让线程释放锁 锁的阻塞:若是A线程获得锁,则B等待;若是A出现阻塞,则B一直处于阻塞 锁状态:无法判断 锁类型:可重入、非公平、不可中断 性能:少量同步 存在层次上:java类 锁的释放:在finally中必须释放锁,lock.unlock,否则会造成死锁 锁的阻塞:分情况而定,线程可以尝试获得锁,线程可以不用一直等待,主要是参考Lock接口中的lockInterruptibly()方法 锁状态:可以判断,可以通过trylock()方法来得知当前线程是否获得锁 锁类型:可重入、公平(亦可非公平)、可中断;ReentrantLock中默认是非公平锁的,new NofairSync 性能:大量同步
发表于 2019-04-25 18:00:21 回复(0)