自学内容网 自学内容网

synchronized和lock的区别

synchronizedLock 都是Java中用于实现线程同步的手段,它们有以下主要区别:

synchronized(同步关键字)

  1. 内置锁synchronized 是Java的一个关键字,它是一个内置锁,由JVM自动管理。
  2. 使用方便:使用synchronized,你只需要在方法声明或代码块前加上synchronized关键字即可。
  3. 不可中断方法:当一个线程执行synchronized方法或块时,其他线程必须等待直到该线程退出同步代码块。
  4. 悲观锁synchronized 是一种悲观锁,它假设冲突发生的可能性较大,因此它会直接上锁。
  5. 锁状态不可改变synchronized 锁定后,无法改变锁状态,它要么锁定,要么不锁定。
  6. 公平性synchronized 不支持公平性设置,即等待时间最长的线程并不一定会最先获得锁。
  7. 功能限制synchronized 只提供了基本的同步功能,没有高级功能,如尝试非阻塞地获取锁、超时等待等。

Lock(锁对象)

  1. 显示锁Lock 是Java java.util.concurrent.locks 包中的一个接口,它是一个显示锁,需要程序员手动管理。
  2. 灵活性高Lock 提供了更复杂的线程控制,例如,可以尝试非阻塞地获取锁、可以响应中断、可指定公平性等。
  3. 可中断:执行Lock的线程可以响应中断,即在等待获取锁的过程中可以中断等待。
  4. 公平性Lock 可以实现公平性,即等待时间最长的线程可以最先获得锁(通过ReentrantLock的构造函数设置)。
  5. 多种锁模式Lock 提供了多种锁模式,如读写锁(ReadWriteLock)。
  6. 悲观/乐观锁Lock 可以实现悲观锁和乐观锁,例如,ReentrantLock 是悲观锁,而StampedLock 是乐观锁。
  7. 高级功能Lock 提供了更多的高级功能,如尝试获取锁、超时获取锁、尝试获取锁后响应中断等。

示例

// 使用 synchronized
public synchronized void synchronizedMethod() {
    // 同步代码
}

// 使用 Lock
Lock lock = new ReentrantLock();
public void lockMethod() {
    lock.lock(); // 获取锁
    try {
        // 同步代码
    } finally {
        lock.unlock(); // 释放锁
    }
}

总结

synchronizedLock 都可以用于线程同步,但它们在用法和功能上有所不同。synchronized 是一种内置锁,使用简单,但功能有限。Lock 是一个显示锁,提供了更多的控制和灵活性,适用于需要高级同步功能的场景。在实际编程中,根据具体需求选择合适的同步机制是非常重要的。


原文地址:https://blog.csdn.net/Founder_Xiao_Xin/article/details/138028506

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!