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 > 同步代码块 > 同步方法。
  • 相关阅读:
    经典音乐插曲推荐![附地址]
    广播电台常用51首背景音乐——绝对经典
    酒吧..夜店常用歌曲~潮人必备音乐噢~【附下载地址】
    ASP与ASP.NET互通COOKIES的一点经验
    linux进程状态浅析
    常用的酒吧经典乐曲106首
    呼和浩特电视台媒资管理系统的设计与分析
    不再为DataGrid生成的表格的单无格中的内容过长、自动折行、表格撑开等问题而烦恼
    Linux shell脚本全面学习
    ASP.NET文件管理显示信息
  • 原文地址:https://www.cnblogs.com/happysml/p/13839626.html
Copyright © 2011-2022 走看看