Java的Lock(锁)

从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同 步锁对象来实现同步。同步锁使用Lock对象充当。

java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的 工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象 加锁,线程开始访问共享资源之前应先获得Lock对象。

 ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和 内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以 显式加锁、释放锁。

例子:

class A{
private final ReentrantLock lock = new ReenTrantLock();

public void m(){

lock.lock();

try{ //保证线程安全的代码; }

finally{ lock.unlock();  } }
}
注意:如果同步代码有异常,要将unlock()写入finally语句块

面试题:synchronized 与 Lock的异同?
   相同:二者都可以解决线程安全问题
   不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器
         Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock())

synchronized 与 Lock 的对比
1. Lock是显式锁(手动开启和关闭锁,别忘记关闭锁),synchronized是 隐式锁,出了作用域自动释放
2. Lock只有代码块锁,synchronized有代码块锁和方法锁
3. 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有 更好的扩展性(提供更多的子类)

优先使用顺序: Lock >同步代码块(已经进入了方法体,分配了相应资源) > 同步方法 (在方法体之外)

面试题:如何解决线程安全问题?有几种方式    答:两种,用Lock或者synchronized。  
发布了63 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sinat_30955745/article/details/105497715