Java线程同步

认识线程同步

 解决方案

方法一:同步代码块

package com.itheima.d3;public class ThreadTest {public static void main(String[] args) {Accout acc = new Accout("ICBC-110",100000);new DrawThread(acc,"小明").start();//小明new DrawThread(acc,"小红").start();//小红Accout acc1 = new Accout("ICBC-112",100000);new DrawThread(acc,"小黑").start();//小黑new DrawThread(acc,"小白").start();//小白}
}
package com.itheima.d3;public class Accout {private String cardId;private double money;public Accout() {}public Accout(String cardId, double money) {this.cardId = cardId;this.money = money;}public static void test(){synchronized (Accout.class){}}public void drawMoney(double money) {//是谁来取钱String name = Thread.currentThread().getName();//1、判断余额是否足够//this代表共享资源synchronized (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 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;}}
package com.itheima.d3;public class DrawThread extends Thread{private Accout acc;public DrawThread(Accout acc, String name){super(name);this.acc = acc;}@Overridepublic void run() {//取钱(小明、小红)acc.drawMoney(100000);}
}

 

方法二:同步方

package com.itheima.d3;public class ThreadTest {public static void main(String[] args) {Accout acc = new Accout("ICBC-110",100000);new DrawThread(acc,"小明").start();//小明new DrawThread(acc,"小红").start();//小红}
}
package com.itheima.d3;public class Accout {private String cardId;private double money;public Accout() {}public Accout(String cardId, double money) {this.cardId = cardId;this.money = money;}//小明、小红同时来取钱//同步方法public synchronized void drawMoney(double money) {//是谁来取钱String name = Thread.currentThread().getName();//1、判断余额是否足够//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 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;}}
package com.itheima.d3;public class DrawThread extends Thread{private Accout acc;public DrawThread(Accout acc, String name){super(name);this.acc = acc;}@Overridepublic void run() {//取钱(小明、小红)acc.drawMoney(100000);}
}

 

方法三:Lock锁

package com.itheima.d3;public class DrawThread extends Thread{private Accout acc;public DrawThread(Accout acc, String name){super(name);this.acc = acc;}@Overridepublic void run() {//取钱(小明、小红)acc.drawMoney(100000);}
}
package com.itheima.d3;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Accout {private String cardId;private double money;//创建了一个对象private final Lock lk = new ReentrantLock();public Accout() {}public Accout(String cardId, double money) {this.cardId = cardId;this.money = money;}//小明、小红同时来取钱public  void drawMoney(double money) {//是谁来取钱String name = Thread.currentThread().getName();lk.lock();//加锁try {//1、判断余额是否足够if (this.money >= money) {System.out.println(name + "来取钱" + money + "成功");this.money -= money;System.out.println(name + "取钱后余额" + this.money);} else {System.out.println(name + "来取钱余额不足");}} catch (Exception e) {e.printStackTrace();}finally {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;}}
package com.itheima.d3;public class ThreadTest {public static void main(String[] args) {Accout acc = new Accout("ICBC-110",100000);new DrawThread(acc,"小明").start();//小明new DrawThread(acc,"小红").start();//小红}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鼎盛合:如何做一个车载便携吸尘器方案

汽车是我们日常生活中极为重要的交通工具,随着我们生活水平的提高自然而然地对汽车的要求也在相对提高,尤其是对汽车内部清洁更是引起许多有车人士的注意。如车载吸尘器深受大家的喜爱这一点就可见对汽车内部清洁的重视。 车载吸尘器是一个用于汽车清洁的…

Qt::Window 、Qt::Tool是 Qt 框架中的一个窗口标志(Window Flag),用于指定窗口的类型和行为

Qt::Window Qt::Window 是 Qt 框架中的一个窗口标志(Window Flag),用于指定窗口的类型和行为。 在 Qt 中,窗口标志用于控制窗口的外观、行为和交互方式。通过使用不同的窗口标志组合,可以定制窗口的特性,…

Python实现DDos攻击实例详解

文章目录 SYN 泛洪攻击Scapy3k 基本用法代码实现DDos 实现思路argparse 模块socket 模块代码实现Client 端程序测试后记关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案…

Kotlin学习——kt里的集合,Map的各种方法之String篇

Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

C++——vector插入与删除和数据存取

一. vector插入和删除 功能描述:对vector容器进行插入、删除操作 函数原型: push back(ele); //尾部插入元素ele pop_back(); //删除最后一个元素 insert(const iterator pos, el…

MFC 读写注册表

在MFC (Microsoft Foundation Classes) 中读写注册表涉及到使用 CRegKey 类,这个类提供了一组方法来操作Windows注册表。以下是如何使用MFC来读取和写入注册表值的基本步骤: 写入注册表值 创建或打开注册表项: 使用 CRegKey::Create 或 CRegKey::Open 方…

LuatOS-SOC接口文档(air780E)--rsa - RSA加密解密

示例 -- 请在电脑上生成私钥和公钥, 当前最高支持4096bit, 一般来说2048bit就够用了 -- openssl genrsa -out privkey.pem 2048 -- openssl rsa -in privkey.pem -pubout -out public.pem -- privkey.pem 是私钥, public.pem 是公钥 -- 私钥用于 加密 和 签名, 通常保密, 放在…

acwing算法基础之动态规划--背包问题

目录 1 基础知识2 模板3 工程化 1 基础知识 (零) 背包问题描述:有 N N N个物品,每个物品的体积是 v i v_i vi​,价值是 w i w_i wi​,现有容量是 V V V的背包,求这个背包能装下的物品的最大价值…

C#中的警告CS0120、CS0176、CS0183、CS0618、CS0649、CS8600、CS8601、CS8602、CS8604、CS8625及处理

目录 一、CS0120 二、CS0176 1.解决前 2.解决后 3.解决办法 三、CS0183 四、CS0618 五、CS8600 六、CS8602 七、CS8622 1. 解决前: 2. 解决后: 3.解决方法: 八、CS8604和CS8625 九、CS0649 十、CS8601 一、CS0120 严重性 代…

【算法萌新闯力扣】:回文链表

力扣题目:回文链表 开篇 今天是备战蓝桥杯的第23天。我加入的编程导航算法通关村也在今天开营啦!那从现在起,我的算法题更新会按照算法村的给的路线更新,更加系统。大家也可以关注我新开的专栏“算法通关村”。里面会有更全面的知…

pandas教程:Techniques for Method Chaining 方法链接的技巧

文章目录 12.3 Techniques for Method Chaining(方法链接的技巧)1 The pipe Method(pipe方法) 12.3 Techniques for Method Chaining(方法链接的技巧) 对序列进行转换的时候,我们会发现会创建很…

操作系统的中断与异常(408常考点)

为了进行核心态和用户态两种状态的切换,引入了中断机制。 中断是计算机系统中的一种事件,它会打断CPU当前正在执行的程序,转而执行另一个程序或者执行特定的处理程序。中断可以来自外部设备(如键盘、鼠标、网络等)、软…

1072 Gas Station (最短路径同时求最短路,最长路,总路径)

题意:给定几处居民住所与几处预选加油站点,求离最近的居民住所最远且所有居民都在该站点服务区内的加油站点,如果有多个,则选择平均距离最小的,再有多个,选择序号最小的。 思路:刚开始不知道未…

振南技术干货集:FFT 你知道?那数字相敏检波 DPSD 呢?(1)

注解目录 1 、DPSD 的基础知识 1.1 应用模型 1.2 原理推导 1.3 硬件 PSD (相敏检波,就是从繁乱复杂的信号中将我们关心的信号检出来,同时对相位敏感。 数学原理,逃不掉的,硬着头皮看吧。) 2 、DPSD …

【电路笔记】-电阻器颜色代码与阻值计算

电阻器颜色代码与阻值计算 文章目录 电阻器颜色代码与阻值计算1、概述2、计算电阻器颜色代码值3、贴片电阻器 电阻器颜色编码使用色带轻松识别电阻器的电阻值及其百分比容差。 1、概述 由于有许多不同类型的电阻器可用,我们需要形成电阻器颜色代码系统以便能够识别…

LuatOS-SOC接口文档(air780E)--repl - “读取-求值-输出” 循环

示例 --[[ 本功能支持的模块及对应的端口 模块/芯片 端口 波特率及其他参数 Air101/Air103 UART0 921600 8 None 1 Air105 UART0 1500000 8 None 1 ESP32C3 UART0 921600 8 None 1 -- 注意, 简约版(无CH343)不支持 ESP32C2 …

Java 注解在 Android 中的使用场景

Java 元注解有 5 种,常用的是 Target 和 Retention 两个。 其中 Retention 表示保留级别,有三种: RetentionPolicy.SOURCE - 标记的注解仅保留在源码级别中,并被编译器忽略RetentionPolicy.CLASS - 标记的注解在编译时由编译器保…

力扣104. 二叉树的最大深度

目录 1.解题思路2.代码实现 1.解题思路 如果我们知道了左子树和右子树的最大深度,那么该二叉树的最大深度即为大的深度加一,而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言&#x…

Vue框架学习笔记——事件scroll和wheel的区别

文章目录 前文提要滚动条滚动事件 scroll鼠标滚动事件 wheel二者不同点 前文提要 本人仅做个人学习记录,如有错误,请多包涵 滚动条滚动事件 scroll scroll事件绑定html页面中的指定滚动条,无论你拖拽滚动条,选中滚动条之后按键盘…

Doris的PROPERTIES与ENGINE(九)

接上篇----------Doris分区与分桶 在建表语句的最后 PROPERTIES 中,可以指定以下两个参数: replication_num 每个 Tablet 的副本数量。默认为 3,建议保持默认即可。在建表语句中,所有 Partition 中的 Tablet 副本数量统一指定。…