Synchronized与ReentrantLock?

相似点:

  1. 可重入

不同点

  1. Synchronized是依赖于JVM实现的;而ReenTrantLock是JDK实现,API层面的互斥锁。Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,需要lock()和unlock()方法配合try/finally语句块来完成。
  2. Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了。synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术,试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞
  3. 锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized。
    ===============
  4. ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。
  5. ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。
  6. ReenTrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。

ReenTrantLock的实现是一种自旋锁,通过循环调用CAS操作来实现加锁。它的性能比较好也是因为避免了使线程进入内核态的阻塞状态。

2. wait()和await() notify()和signal() notifyAll()和signalAll()?

  1. wait()、notify()和notifyAll()一般是跟synchronized配合一起使用。
  2. Condition类的await()、signal()和signalAll(),一般是配合Lock一起使用,是显式的线程间协调同步操作类。

3. sleep()与wait()区别

1.sleep是线程线程类(Thread)的方法,指定时间后CPU再回到该线程继续往下执行(sleep方法只让出了CPU,并不会释放同步资源锁);
wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,再次尝试获得对象锁才会进入运行状态;
2. sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
3. sleep方法必须要捕获异常,而wait方法不需要捕获异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值