并发编程的锁机制:synchronized和lock

2020-04-27  本文已影响0人  Android_冯星
image.png

synchronized

Java中Synchronized的用法

public synchronized void save(){}
public static synchronized void save(){//内容}
public void save(String str){
//用的这个str对象来加锁
synchronized(str){ 
    //内容
    }
}
public void save(String str){
synchronized(A.class){ 
    //内容
    }
}

Lock

Lock接口主要相关的类和接口如下。

image.png

ReadWriteLock是读写锁接口,其实现类为ReetrantReadWriteLock。ReetrantLock实现了Lock接口。

public interface Lock {
    void lock();
    void lockInterruptibly() throws InterruptedException;  
    boolean tryLock();  
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;  
    void unlock();  
    Condition newCondition();
}

synchronized和lock的区别

  1. Lock是接口,synchronized是Java关键字。
  2. synchronized发生异常是自动释放锁,Lock不会自定释放锁,在lock发生异常时,如果没有unlock释放锁会造成死锁的现象,在使用Lock时需要在finally块中释放锁;
  3. Lock可以让等待的线程进行中断操作,synchronized不行,使用synchronized时,等待的线程会一直等待下去,不能响应中断。
  4. 通过Lock可以知道有没有获取到锁,而synchronized不知道。
  5. Lock可以提高多个线程进行读操作的工作效率(可以通过readwritelock实现读写分离)。
  6. 性能上来说,在资源竞争不激烈的情形下,Lock性能稍微比synchronized差点(编译程序通常会尽可能的进行优化synchronized)。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。
上一篇下一篇

猜你喜欢

热点阅读