2021年1月4日星期一

Synchronized和Lock的区别

引言

  在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什么场景下适合用什么可能还不大清楚,主要的区别大致如下:

区别

    1、synchronized是java关键字,而Lock是java中的一个接口

    2、synchronized会自动释放锁,而Lock必须手动释放锁

    3、synchronized是不可中断的,Lock可以中断也可以不中断

   4、通过Lock可以知道线程有没有拿到锁,而synchronized不能

    5、synchronized能锁住方法和代码块,而Lock只能锁住代码块

    6、Lock可以使用读锁提高多线程读效率

    7、synchronized是非公平锁,ReentranLock可以控制是否公平锁

 

从Lock接口中我们可以看到主要有5个方法,这些方法的功能从注释中可以看出:

1 lock():获取锁,如果锁被暂用则一直等待 2 unlock():释放锁 3 tryLock(): 注意返回类型是boolean,如果获取锁的时候锁被占用就返回false,否则返回true4 tryLock(long time, TimeUnit unit):比起tryLock()就是给了一个时间期限,保证等待参数时间 5 lockInterruptibly():用该锁的获得方式,如果线程在获取锁的阶段进入了等待,那么可以中断此线程,先去做别的事   通过 以上的解释,大致可以解释在上个部分中"锁类型(lockInterruptibly())","锁状态(tryLock())"等问题,还有就是前面子所获取的过程我所写的"大致就是可以尝试获得锁,线程可以不会一直等待"用了"可以"的原因。

lock():

 1 public class LockTest { 2  private Lock lock = new ReentrantLock(); 3  4  private void method(Thread thread) { 5   lock.lock(); 6   try { 7    System.out.println(thread.getName() + " has gotten the lock!"); 8   } catch (Exception e) { 9    e.printStackTrace();10   } finally {11    System.out.println(thread.getName() + " has unlocked the lock!");12    lock.unlock();13   }14  }15 16  public static void main(String[] args) {17   final LockTest test = new LockTest();18 19   Thread t1 = new Thread(new Runnable() {20    @Override21    public void run() {22     test.method(Thread.currentThread());23    }24   }, "t1");25   Thread t2 = new Thread(new Runnable() {26    @Override27    public void run() {28     test.method(Thread.currentThread());29    }30   }, "t2");31   t1.start();32   t2.start();33  }34 35 }

运行结果:

t1 has gotten the lock!t1 has unlocked the lock!t2 has gotten the lock!t2 has unlocked the lock!

 

tryLock():

 1 public class LockTest { 2  private Lock lock = new ReentrantLock(); 3  4  private void method(Thread thread) { 5   6   if (lock.tryLock()) { 7    lock.lock(); 8    try { 9     System.out.println(thread.getName() + " has gotten the lock!");10    } catch (Exception e) {11     e.printStackTrace();12    } finally {13     System.out.println(thread.getName() + " has unlocked the lock!");14     lock.unlock();15    }16   } else {17    System.out.println("I'm "+thread.getName()+". Someone has gotten the lock!");18   }19  }20 21  public static void main(String[] args) {22   LockTest test = new LockTest();23 24   Thread t1 = new Thread(() -> test.method(Thread.currentThread()), "t1");25   Thread t2 = new Thread(new Runnable() {26    @Override27    public void run() {28     test.method(Thread.currentThread());29    }30   }, "t2");31   t1.start();32   t2.start();33  }34 }

运行结果:

t1 has gotten the lock!t1 has unlocked the lock!I'm t2. Someone has gotten the lock!

看到这里相信大家也都会使用如何使用Lock了吧,关于tryLock(long time, TimeUnit unit)和lockInterruptibly()不再赘述。前者主要存在一个等待时间,在测试代码中写入一个等待时间,后者主要是等待中断,会抛出一个中断异常,常用度不高,喜欢探究可以自己深入研究。











原文转载:http://www.shaoqun.com/a/504802.html

跨境电商:https://www.ikjzd.com/

net-a-porter:https://www.ikjzd.com/w/2132

shopyy:https://www.ikjzd.com/w/1661


引言在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什么场景下适合用什么可能还不大清楚,主要的区别大致如下:区别1、synchronized是java关键字,而Lock是java中的一个接口2、synchronized会自动释放锁,而Lock必须手动释放锁3、synchronized是不可中断的,Lock可以中断也可以不中断4
汇通天下:汇通天下
c88:c88
爬山看夜景 武汉三大地点推荐:爬山看夜景 武汉三大地点推荐
口述:90后娇妻欲望强 我不行她就睡邻居90后妻子欲望:口述:90后娇妻欲望强 我不行她就睡邻居90后妻子欲望
东莞风车节在哪里?2020东莞风车节时间地点票价?:东莞风车节在哪里?2020东莞风车节时间地点票价?

没有评论:

发表评论