前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Lock锁解决线程安全问题

使用Lock锁解决线程安全问题

作者头像
别团等shy哥发育
发布2023-02-25 16:41:05
2880
发布2023-02-25 16:41:05
举报
文章被收录于专栏:全栈开发那些事

文章目录

1、Lock锁

  • java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的 工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象 加锁,线程开始访问共享资源之前应先获得Lock对象。
  • ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和 内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以 显式加锁、释放锁。
代码语言:javascript
复制
class A{
private final ReentrantLock lock = new ReenTrantLock(); public void m(){
lock.lock();
try{
//保证线程安全的代码; }
finally{
lock.unlock();  
} }
}

注意:如果同步代码有异常,要将unlock()写入finally语句块

2、Lock锁解决线程安全问题

还是那个三个窗口卖票程序,如果不考虑线程安全问题就会出现错票、重复票等现象。现在用Lock锁的方式解决线程安全问题

代码语言:javascript
复制
class Window implements Runnable{

    private int ticket = 100;
    //1.实例化ReentrantLock
    private ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        while(true){
            try{
                //2.调用锁定方法lock()
                lock.lock();

                if(ticket > 0){

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName() + ":售票,票号为:" + ticket);
                    ticket--;
                }else{
                    break;
                }
            }finally {
                //3.调用解锁方法:unlock()
                lock.unlock();
            }

        }
    }
}

public class LockTest {
    public static void main(String[] args) {
        Window w = new Window();

        Thread t1 = new Thread(w);
        Thread t2 = new Thread(w);
        Thread t3 = new Thread(w);

        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}
在这里插入图片描述
在这里插入图片描述

可以看到,重复票、错票等问题已经消失。

3、总结

3.1、synchronized 与 Lock的异同?

  1. Lock是显式锁(手动开启和关闭锁,别忘记关闭锁),synchronized是 隐式锁,出了作用域自动释放
  2. Lock只有代码块锁,synchronized有代码块锁和方法锁
  3. 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有 更好的扩展性(提供更多的子类) 优先使用顺序: Lock ->同步代码块(已经进入了方法体,分配了相应资源) -> 同步方法 (在方法体之外)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1、Lock锁
  • 2、Lock锁解决线程安全问题
  • 3、总结
    • 3.1、synchronized 与 Lock的异同?
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档