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;
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public 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();//小红
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI神秘项目Q-star曝光,人类永生或灭绝,将在我们有生之年发生

上周,OpenAI人事风波暂停的尾声中,有个“可能威胁人类”的、代号为“Q*”的神秘项目被抛掷出来。 传言中,Sam Altman被解雇前,几名研究人员向董事会发了一封信,警告一项强大的人工智能发现可能威胁到人类,而…

使用 Java 来读取 Excel 文件,检查每一行中的 URL,并将不符合条件的行标记为红色

-- 日、时、分、秒,这是计时的单位,惜时就应该惜日、惜时、惜分、惜秒。 用 Java 来读取 Excel 文件,检查每一行中的 URL,并将不符合条件的行标记为红色。以下是一个简单的示例,使用 Apache POI 进行 Excel 操作&#…

数据结构与算法编程题31

判断给定二叉树是否是完全二叉树 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode* lchild, …

ref详解(C#)

本质上来说 ref 的就是把 C/C 指针的那一套又拿回来了&#xff0c;而且还封装成一套自己的玩法。 我想设计者的初心把 ref 的功能限制得死死的&#xff0c;可能也考虑到 C# 是一门面向业务开发的语言&#xff0c;讲究的是做项目快狠准&#xff0c;性能反而不是第一要素&#x…

进程等待讲解

今日为大家分享有关进程等待的知识&#xff01;希望读完本文&#xff0c;大家能有一定的收获&#xff01; 正文开始&#xff01; 进程等待的引进 既然我们今天要讲进程等待这个概念&#xff01;那么只有我们把下面这三个方面搞明白&#xff0c;才能真正的了解进程等待&#x…

[Spring ~必知必会] Bean 基础常识汇总

文章目录 Bean 相关到底什么是beanFactorybeanFactory能干啥ApplicationContext是什么ApplicationContext的功能比 BeanFactory多了什么 容器的实现BeanFactory的实现ApplicationContext的实现xml 配置配置类配置 Bean 的生命周期3.1 Bean 的常见的后处理器测试代码总结 3.2 工…

数据结构 | TOP-K问题

数据结构 | TOP-K问题 文章目录 数据结构 | TOP-K问题随机生成一些数据&#xff0c;找前k个最大值进行取前k个值建堆找到了前k个结果以及全部代码 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大。 就是从N个数里面找…

P14 C++局部静态变量static延长生命周期

目录 01 前言 02 变量的作用域与生命周期 2.1 什么是作用域&#xff1a; 2.2 什么是变量的生命周期&#xff1a; 03 局部静态 3.1非静态变量例子 3.2静态变量例子 04 全局变量 05 后话 01 前言 在前几期里&#xff0c;我们了解了static关键字在特定上下文中的含义。 …

innovus如何在floorplan view显示所有module

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 如题&#xff0c;innovus的图形界面在floorplan view下默认只能显示instance数量超过100个的module&#xff0c;如果要显示更小的module&#xff0c;需要在VIEW-Set Perference…

分享从零开始学习网络设备配置--任务4.3 使用动态路由RIPng实现网络连通

任务描述 某公司使用IPv6技术搭建企业网络&#xff0c;由于静态路由需要管理员手工配置&#xff0c;在网络拓扑发生变化时&#xff0c;也不会自动生成新的路由&#xff0c;因此采用IPv6动态路由协议RIPng实现网络连通&#xff0c;实现任意两个节点之间的通信&#xff0c;并降低…

堆的应用:堆排序

文章目录 前言堆排序的实现&#xff08;升序为例&#xff09;代码 前言 堆排序&#xff0c;顾名思义是一个利用堆来完成排序的一个操作。在之前&#xff0c;小编在[C语言学习系列–&#xff1e;【关于qsort函数的详解以及它的模拟实现】] 谈到冒泡排序&#xff0c;但是冒泡排序…

京东秒杀之秒杀详情

1 编写前端页面&#xff08;商品详情&#xff09; <!DOCTYPE html> <head><title>商品详情</title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><script type"text/javascript" src&…

GPU集群使用Tip:查询端口号占用情况、进程由哪个用户创建、运行时指定某一张显卡

在GPU集群上运行代码&#xff0c;会面临一些问题&#xff1a; &#xff08;1&#xff09;跑着跑着GPU memory分配失败 – 因为有其他人在使用 &#xff08;2&#xff09;运行时显示端口号已被占用&#xff0c;需要你换一个端口。 这个时候一般采取的方法有&#xff1a; &#x…

java springboot测试类Transactional解决 测试过程中在数据库留下测试数据问题

好 目前 我们已经完成了表现层对应的测试了 但这里有个坑 如果我们在执行某个声明周期时 包含了测试的过程 它会在数据库中留下一条数据 但真实企业开发 绝对不允许 过一遍留一组数据的 那么 我们的期望就是 执行测试过程 但不要留下任何数据 这是我们的数据库表 然后 这里…

帆软报表 channel 反序列化漏洞复现

0x01 产品简介 FineReport、FineBI 是帆软软件开发的企业级报表设计和数据分析工具与商业智能平台。 0x02 漏洞概述 帆软FineReport、FineBI 存在反序列化漏洞&#xff0c;攻击者可向 /webroot/decision/remote/design/channel 接口发送精心构造的反序列化数据&#xff0c;在目…

E云管家微信群聊机器人开发

请求URL&#xff1a; http://域名地址/modifyGroupRemark 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是String登录实例标识chatRo…

【html+css】表单元素

目录 表单元素 展示图 简约写法&#xff1a; 完美写法 表单元素 输入框 单选框 复选框 下拉框 按钮 展示图 简约写法&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

域名邮箱与企业邮箱的区别:功能、应用与优势

根据使用者的不同需求&#xff0c;电子邮件分为域名邮箱和企业邮箱两种类型。那么这两种邮箱之间究竟存在哪些区别呢&#xff1f;本文将从定义、优势和劣势三个方面进行详细解析。 什么是域名邮箱&#xff1f; 域名邮箱&#xff0c;顾名思义是以域名作为后缀的电子邮箱。域名邮…

第二十五章 解析cfg文件及读取获得网络结构

网络结构 以YOLOv3_SPP为例 cfg文件 部分&#xff0c;只是用来展示&#xff0c;全部的代码在文章最后 [net] # Testing # batch1 # subdivisions1 # Training batch64 subdivisions16 width608 height608 channels3 momentum0.9 de…

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

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