zoukankan      html  css  js  c++  java
  • 同步锁Lock

    Lock(锁)

    • 从JDK5.0开始,Java提供了更强大的线程同步机制,通过显示定义同步锁对象来实现同步。同步锁使用Lock对象充当。
    • java.util.concurrent.locks.Lock接口是控制多个线程对共享资源访问的工具。每次只能有一个线程对Lock对象加锁。
    • ReentranLock(可重入锁)类实现了Lock,在实现线程安全控制中比较常用。

    代码演示

    package MultiProcess;
    
    public class TestLock {
        public static void main(String[] args) {
            TestLock1 thread1 = new TestLock1();
    
            new Thread(thread1).start();
            new Thread(thread1).start();
            new Thread(thread1).start();
        }
    }
    
    class TestLock1 implements Runnable{
        int ticket = 10;
    
        @Override
        public void run() {
            while(true){
                if(ticket > 0){
    
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(ticket--);
                }
                else{
                    break;
                }
            }
        }
    }
    
    结果
    9
    8
    10
    7
    6
    5
    4
    3
    2
    1
    0
    -1
    

    加Lock锁

    package MultiProcess;
    
    import java.util.concurrent.locks.ReentrantLock;
    
    public class TestLock {
        public static void main(String[] args) {
            TestLock1 thread1 = new TestLock1();
    
            new Thread(thread1).start();
            new Thread(thread1).start();
            new Thread(thread1).start();
        }
    }
    
    class TestLock1 implements Runnable{
        int ticket = 10;
    	//定义锁对象
        private final ReentrantLock lock = new ReentrantLock();
        @Override
        public void run() {
            while(true){
                //加锁解锁建议用try,finally完成
                try{
                    //加锁
                    lock.lock();
                    if(ticket > 0){
                        try {
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        System.out.println(ticket--);
                    }
                    else{
                        break;
                    }
                 //finally中解锁
                }finally {
                    lock.unlock();
                }
            }
        }
    }
    
    结果
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    
    

    synchronized与Lock的对比

    • Lock是显示锁,需要手动改开启和关闭。synchronized是隐式锁,出了作用域自动释放。
    • Lock只有代码块锁,synchronized有代码块锁和方法锁。
    • 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。
    • Lock提供了更多子类,扩展性更好。
    • 优先使用顺序:Lock > 同步代码块 > 同步方法。
  • 相关阅读:
    deepin15.7挂载/home到单独的分区:
    Docker配置整理
    Docker安装方法整理
    在ArangoDB中实现connectedcomponents算法
    Blazor入手教程(十一)使用组件库AntDesign Blazor
    Blazor入手教程(十)部署安装
    Blazor入手教程(九)c#和js互相调用
    Blazor入手教程(八)布局Layout
    Blazor入手教程(七)表单
    Blazor入手教程(六)组件的生命周期
  • 原文地址:https://www.cnblogs.com/happysml/p/13839626.html
Copyright © 2011-2022 走看看