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多线程上锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Mybatis实现联表查询并且分页功能

    Mybatis实现联表查询并且分页功能

    这篇文章主要介绍了Mybatis实现联表查询并且分页功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 解决idea删除模块后重新创建显示该模块已经被注册的问题

    解决idea删除模块后重新创建显示该模块已经被注册的问题

    这篇文章主要介绍了解决idea删除模块后重新创建显示该模块已经被注册的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Flowable执行完毕的流程查找方法

    Flowable执行完毕的流程查找方法

    这篇文章主要为大家介绍了Flowable执行完毕的流程查找方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Spring-AOP 静态正则表达式方法如何匹配切面

    Spring-AOP 静态正则表达式方法如何匹配切面

    这篇文章主要介绍了Spring-AOP 静态正则表达式方法如何匹配切面的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • spring-data-jpa中findOne与getOne的区别说明

    spring-data-jpa中findOne与getOne的区别说明

    这篇文章主要介绍了spring-data-jpa中findOne与getOne的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java中单例模式讲解

    java中单例模式讲解

    这篇文章主要介绍了java中单例模式,本文通过简单的案例,讲解了该模式在java中的使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • springboot中实现通过后台创建临时表

    springboot中实现通过后台创建临时表

    这篇文章主要介绍了springboot中实现通过后台创建临时表操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Rabbitmq中的channel接口常用方法详解

    Rabbitmq中的channel接口常用方法详解

    这篇文章主要介绍了Rabbitmq中的channel接口常用方法详解,为了确保消息一定被消费者处理,rabbitMQ提供了消息确认功能,就是在消费者处理完任务之后,就给服务器一个回馈,服务器就会将该消息删除,需要的朋友可以参考下
    2023-09-09
  • java序列化与反序列化的使用方法汇总

    java序列化与反序列化的使用方法汇总

    序列化是一种对象持久化的手段,普遍应用在网络传输、RMI等场景中,这篇文章主要给大家总结介绍了关于java序列化与反序列化的使用方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • spring boot打包成可执行jar包

    spring boot打包成可执行jar包

    本篇文章主要介绍了spring boot打包成可执行jar包,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论