synchronized和lock有什么区别?

155 阅读1分钟
  1. 原始构成:

    • synchronized是JVM层面提供的关键字;
    • lock是JUC包下的一个接口;
  2. 使用方法:

    • synchronized不需要用户去手动释放锁,当synchronized代码执行完后系统会自动让线程释放对锁的占用;
    • ReentrantLock需要用户去手动释放锁,如果没主动释放,就可能导致死锁现象;
  3. 等待是否可中断:

    • synchronized不可中断,除非抛出异常或者正常运行完成;
    • ReentrantLock可以中断,①设置超时方法tryLock(Long timeout, TimeUnit unit);②代码块中调用lock.lockInterruptibly()中断等待获取锁线程,然后调用thread.interrupt中断;
  4. 加锁是否公平:

    • synchronized是非公平锁;
    • ReentrantLock默认是非公平锁,但是构造方法可以传入boolean值,true为公平锁,默认为false非公平锁;
  5. 阻塞唤醒机制不同:

    • synchronized通过wait-notify/notifyAll只能随机唤醒一个或者全部线程;
    • ReentrantLock通过condition可以实现分组唤醒需要唤醒的线程,可以精准唤醒。