java多线程三种上锁方式小结

 更新时间:2023年12月22日 11:06:16   作者:湖边看客  
本文主要介绍了java多线程三种上锁方式小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

以下以两人共用一个银行卡账户的方式,同时取钱,两条线程同时执行,为了保证线程安全,我们对关键的部分进行加锁的三种方式

线程类

public class DrawThread extends Thread {
    private Account acc;

    public DrawThread(Account acc, String name){
        super(name);
        this.acc=acc;
    }

    @Override
    public  void run(){
        //取钱  //每个线程在start的时候   都会执行  这个run方法
        acc.drawMoney(10000);
    }
}

账户类

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Account {
    private  String cardId;
    private  double money;
    //创建一个锁对象
    private final Lock lk =new ReentrantLock(); //手动锁


    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }


    //静态代码   用class作为锁
    public static  void test(){
        synchronized (Account.class){

        }
    }

    //取钱的方法
    //同步代码块上锁
     /**   public void drawMoney(double money){
            //谁来取钱?
            String name = Thread.currentThread().getName();
            //判断余额是否足够
            synchronized (this){  //this 在这个过程中是共同拥有的相同的数据 所以能锁住
                if(this.money>=money){
                    System.out.println(name+"取钱"+money+"成功!");
                    this.money -= money;
                    System.out.println(name+"取钱后,剩余"+this.money);
                }else {
                    System.out.println(name+"余额不足");
                }
            }
        }
    */

    //取钱方法
    //同步方法上锁
    /** public synchronized void drawMoney(double money){
         //谁来取钱?
         String name = Thread.currentThread().getName();
         //判断余额是否足够
             if(this.money>=money){
                 System.out.println(name+"取钱"+money+"成功!");
                 this.money -= money;
                 System.out.println(name+"取钱后,剩余"+this.money);
             }else {
                 System.out.println(name+"余额不足");
             }

     }
    */

    //取钱的方法
    //手动锁
    public synchronized void drawMoney(double money){
        //谁来取钱?
        String name = Thread.currentThread().getName();
        lk.lock(); //加锁
        //判断余额是否足够
        if(this.money>=money){
            System.out.println(name+"取钱"+money+"成功!");
            this.money -= money;
            System.out.println(name+"取钱后,剩余"+this.money);
        }else {
            System.out.println(name+"余额不足");
        }
        lk.unlock(); //解锁
    }




    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

}

执行

public class ThreadTest {

    public static void main(String[] args) {
        //创建一个账户
        Account acc = new Account("ic000",10000);
        //创建两个线程分别代表小明和小红  同时  在这个个账户中取钱


        new DrawThread(acc,"小明").start();

        new DrawThread(acc,"小红").start();


        Account acc2 = new Account("ic002",10000);
        //创建两个线程分别代表小明和小红  同时  在这个个账户中取钱

        new DrawThread(acc2,"小黑").start();

        new DrawThread(acc2,"小白").start();

    }

}

效果: 

到此这篇关于java多线程三种上锁方式小结的文章就介绍到这了,更多相关java多线程上锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • jmeter压力测试工具简介_动力节点Java学院整理

    jmeter压力测试工具简介_动力节点Java学院整理

    这篇文章主要为大家详细介绍了jmeter压力测试工具相关介绍资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • ajax实时监测与springboot的实例分析

    ajax实时监测与springboot的实例分析

    本文将介绍如何使用 AJAX 技术结合 Spring Boot 构建一个实时反馈用户输入的应用,我们将创建一个简单的输入框,当用户在输入框中键入文本时,应用将异步地向后端发送请求,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Java设计模式之静态工厂模式详解

    Java设计模式之静态工厂模式详解

    这篇文章主要介绍了Java设计模式之静态工厂模式,简单说明了静态工厂模式的概念、原理、实现与使用方法,需要的朋友可以参考下
    2017-09-09
  • SpringCloud实现Redis在各个微服务的Session共享问题

    SpringCloud实现Redis在各个微服务的Session共享问题

    Redis是运行在内存中,查取速度很快。本文重点给大家介绍SpringCloud实现Redis在各个微服务的Session共享,感兴趣的朋友一起看看吧
    2018-08-08
  • SpringBoot实现图形验证码的操作方法

    SpringBoot实现图形验证码的操作方法

    随着安全性的要求越来越高,目前许多项目中都使用了验证码,验证码也有各种类型,如 图形验证码、短信验证码、邮件验证码、人脸识别等,本文给大家介绍SpringBoot实现图形验证码的方法,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • 基于java实现停车场管理系统

    基于java实现停车场管理系统

    这篇文章主要为大家详细介绍了基于java实现停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Java实现游戏飞机大战-III的示例代码

    Java实现游戏飞机大战-III的示例代码

    这篇文章主要为大家介绍了如何利用Java实现经典的游戏之飞机大战,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试
    2022-02-02
  • springboot项目整合druid数据库连接池的实现

    springboot项目整合druid数据库连接池的实现

    这篇文章主要介绍了springboot项目整合druid数据库连接池的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java实现快速并查集

    Java实现快速并查集

    这篇文章主要为大家详细介绍了Java实现快速并查集,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Java 8 引入lambda表达式的原因解析

    Java 8 引入lambda表达式的原因解析

    这篇文章主要介绍了Java 8 引入lambda表达式的原因解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论