Lock(锁)

作者: i小雨 | 来源:发表于2020-11-16 14:16 被阅读0次
    • 从JDK5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当
    • java.util.concunrrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。
      锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象
    • ReentrantLock类实现了Lock接口,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以显式加锁、释放锁。

    注意: ReentrantLock叫做可重入锁

    测试Lock锁:

    package com.company.ThreadTest;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class TestLock {
        public static void main(String[] args) {
            TestLcok2 testLcok2 = new TestLcok2();
    
            Thread t1 = new Thread(testLcok2,"用户1");
            Thread t2 = new Thread(testLcok2,"用户2");
            Thread t3 = new Thread(testLcok2,"用户3");
            t1.start();
            t2.start();
            t3.start();
        }
    }
    class TestLcok2 implements Runnable{
    
        int ticketNums = 10;
    
        //定义lock锁
        private final Lock lock = new ReentrantLock();
    
        @Override
        public void run() {
            while (true){
                lock.lock(); //加锁
                try {
                    if (ticketNums>0){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"抢到了第"+ticketNums--+"张票");
                    }else{
                        break;
                    }
                }finally {
                    lock.unlock(); //解锁
                }
            }
        }
    }
    
    

    结果:

    用户1抢到了第10张票
    用户2抢到了第9张票
    用户2抢到了第8张票
    用户2抢到了第7张票
    用户2抢到了第6张票
    用户2抢到了第5张票
    用户2抢到了第4张票
    用户3抢到了第3张票
    用户3抢到了第2张票
    用户3抢到了第1张票
    

    Lock的使用格式:

    1605175777(1).jpg

    synchronized和Lock的对比:

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

    相关文章

      网友评论

          本文标题:Lock(锁)

          本文链接:https://www.haomeiwen.com/subject/dzmpbktx.html