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多线程上锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot favicon Chrome设置问题解决方案
在本篇文章里小编给大家分享的是关于SpringBoot favicon Chrome设置问题实例内容,小的朋友们可以参考学习下。2020-02-02Java Springboot websocket使用案例详解
这篇文章主要介绍了Java Springboot websocket使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-09-09
最新评论