首页 > 其他 > 详细

Lock(锁)

时间:2021-04-25 18:01:34      阅读:17      评论:0      收藏:0      [点我收藏+]

Lock(锁)

  • 从JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当
  • java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象
  • ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以显式加锁、释放锁
public class TestLock {
    public static void main(String[] args) {
        Demo demo = new Demo();
        new Thread(demo).start();
        new Thread(demo).start();
        new Thread(demo).start();
    }
}
class Demo implements Runnable{
    int ticketsNum = 10;
    //定义lock锁
    private final ReentrantLock lock = new ReentrantLock();  //可重入锁
    @Override
    public void run() {
        while (true){
            try {
                lock.lock();   //加锁
                if (ticketsNum > 0){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(ticketsNum--);
                }else {
                    break;
                }
            }finally {
                //解锁
                lock.unlock();
            }
        }
    }
}
  • synchronized 与 Lock 的对比

    • Lock是显式锁(手动开启和关闭锁,别忘记关闭锁)synchronized是隐式锁,出了作用域自动释放
    • Lock只有代码块锁,synchronized有代码块锁和方法锁
    • 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)
    • 优先使用顺序:
      • Lock > 同步代码块(已经进入了方法体,分配了相应资源)> 同步方法(在方法体之外)

Lock(锁)

原文:https://www.cnblogs.com/saxonsong/p/14699142.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!