黑马程序员_Java基础[29]_线程间通讯、解决问题、lock

华为OD机试真题 2026.11.4. 新系统 【河流水系流量评估】 华为OD机试真题 新系统【河流水系流量评估】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【河流水系流量评估】多语言题解。 阅读详情
---------- android培训 、 java培训 、期待与您交流! ----------


/*
 * 线程间通讯:-解决安全问题
 * 其实就是多个线程在操作同一个资源
 * 但是操作的动作不同

 */
/*【用举例的思路注解】
 * 【1】编写完毕,
 * 【2】运行我们发现,小焕焕的性别一会女一会man, 是线程出现了安全漏洞
 * 接下来,我们封堵上这个漏洞。采用同步
 *                        想到2个前提,
 * 同步的前提
 * 1、必须有2个以上的线程  【a】【b】
 * 2、必须是一个锁
 *         我们先用的是obj 发现不是同一个,然后用了this 也不是,那么该程序在内存总有一个是唯一的
 *             发现,内存里有4个类,类名.class   然后我们继续看,这个程序里,还有一个对象是唯一的
 *             那就是主函数中的【r】。

 * 【3】搞定以后,我们发现,按道理应该是存一个打印一个才对。
 * 【等待唤醒机制】  wait();等待    notify();唤醒    notifyAll();全部唤醒  都必须有监视器,就是锁
 *
 * 这三个方法,都使用在同步中,因为要持有监视器(锁)的线程操作,
 * 所以要使用在同步中,因为只有同步才具有监视器(锁)的感念
 *
 * 为什么这些操作线程的方法要定义在Object类中呢?
 * 因为这些 方法在操作同步中线程时,都必须要表示他们所操作线程持有的锁
 * 只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒
 * 不可以对不同锁中的线程进行唤醒

 *
 * 也就是说:等待和唤醒必须是同一个锁
 *
 * 而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object中
 */

//设计一个煤矿堆
class Res{
    String name;
    String set;
    boolean falg = false;
}
//设计一个进货的货车
class Input implements Runnable{
    private Res r;
    Input(Res r){
        this.r=r;
    }
    Object obj=new Object();
    public void run(){
        int x=0;

        while(true){
            synchronized(r){//【a】    
                
                    if(r.falg)
                            try{r.wait();}

                           catch(Exception e){}
                    if(x==0){    
                        r.name="Yunyao";
                        r.set="man";
                    }
                    else{
                        r.name="小焕焕";
                        r.set="女";
                    }
                    x=(x+1)%2;    
                    r.falg=true;
                    r.notify();
            }
        }
    }    
}
//设计一个拉货的货车
class Output implements Runnable{
    private Res r;
    Output(Res r){
        this.r=r;
    }
    Object obj=new Object();
    public void run(){
        //int x=0;
        while(true){
            synchronized(r){//【b】
                if(!r.falg)
                    try{r.wait();}catch(Exception e){}
                System.out.println(r.name+"..."+r.set+"...");
                //x+=1;
                r.falg=false;
                r.notify();
            
            }
        }            
    }
}
public class D_Th_InputOutpt {
    public static void main(String[] args) {
        Res r=new Res();//创建一个煤矿堆  程序中唯一的一个对象。
        
        Input  in = new Input(r); //创建一个进货的车
        Output ot = new Output(r);//创建一个出货的车
        
        Thread t1 = new Thread(in);//进入高速通道
        Thread t2 = new Thread(ot);
        
        t1.start();// 开始跑起走
        t2.start();

    }
}

--------------------------------------------------------------------------------------------------------

优化一

package _Day12;
/*
 * 对前一个问题进行优化。
 */

//设计一个煤矿堆
class Res1{
    private String name;
    private String set;
    boolean falg = false;
    //同步函数   非静态同步函数 用的锁是  this ,记住了。
    public synchronized void setInfo(String name,String set){
        if(falg)
            try{this.wait();}catch(Exception e){}
        this.name=name;
        this.set=set;
        this.falg=true;
        this.notify();
    }
    public synchronized void showInfo(){
        if(!falg)
            try{this.wait();}catch(Exception e){}
        System.out.println(this.name+"..."+this.set);
        this.falg=false;
        this.notify();
    }
}
//设计一个进货的货车
class Input1 implements Runnable{
    private Res1 r;
    Input1(Res1 r){
        this.r=r;
    }
    public void run(){
        int x=0;
        while(true){                
            if(x==0)    
                r.setInfo("fei", "man");
            else
                r.setInfo("小焕焕", "女女女女女");
            x=(x+1)%2;    
        }
    }    
}
//设计一个拉货的货车
class Output1 implements Runnable{
    private Res1 r;
    Output1(Res1 r){
        this.r=r;
    }
    public void run(){
        while(true){
            r.showInfo();
        }            
    }
}




public class D_Th_YouhuaInOut {
    public static void main(String[] args) {
        Res1 r=new Res1();//创建一个煤矿堆
        
        new Thread(new Input1(r)).start();
        new Thread(new Output1(r)).start();
        /* 六句优化成上面两句【 匿名对象形式】
        Input1  in = new Input1(r); //创建一个进货的车
        Output1 ot = new Output1(r);//创建一个出货的车
        
        Thread t1 = new Thread(in);//进入高速通道
        Thread t2 = new Thread(ot);
        
        t1.start();// 开始跑起走
        t2.start();
        */
    }

}

---------------------------------------------------------------------------------------------
/*
 * 线程间通信--生产者消费者
 */


        /*当生产和消费是单线程的时候没有问题,下面我们把两条线都加一倍试试
           发现有问题,经判断是因为线程被唤醒后没有对falg再次进行判断,
                因为if只执行一次,现在,我们把if替换成while试试
                发现4个线程出现了同时等待。。。。
            notify唤醒的是线程池中第一个被等待的线程,很有可能就是本方的,
                导致所有线程等待,从而数据错乱
            而使用while 则容易出现线程全部出现同时等待的现象。
            
            所以必须使用:notifyAll  全部唤醒
                因为有while,所以都会循环去判断标记,进入循环渐进的生成消费。
                
            【自我总结】【注意:1.5以前版本使用】升级1.5里程碑版本的时候改
                成了5.0具体【【【LOCK】】】优化synchronized 请看D_Th_Lock
                当有多条线程时候,必须要使用while,notifyAll
                    while 必须去判断标记,是不是在标记允许范围内做动作
                    notifyAll 要把对方唤醒,
        
        */
        public class D_Th_YouhuaInOut2 {
        public static void main(String []args){
               Resource r=new Resource();
               new Thread(new Shengc(r)).start();
               new Thread(new Shengc(r)).start();
               new Thread(new Xiaof(r)).start();
               new Thread(new Xiaof(r)).start();

        
        Shengc sc=new Shengc(r);
               Xiaof  xf=new Xiaof(r);
        /*
        Thread t1=new Thread(sc);
        Thread t2=new Thread(xf);
        Thread t3=new Thread(sc);
        Thread t4=new Thread(xf);
        t1.start();
        t2.start();
        t3.start();
        t4.start();

        */
    }
}

class Resource{
    private String name;
    private int count=1;
    private boolean falg=false;
    public synchronized void set(String name){
        while(falg)
            try{this.wait();}catch(Exception e){}
        this.name=name+"..."+count++;
        
        System.out.println(Thread.currentThread().getName()+"..生产.."+this.name);
        this.falg=true;
        this.notifyAll();    
    }
    public synchronized void get(){
        while(!falg)
            try{this.wait();}catch(Exception e){}
        System.out.println(Thread.currentThread().getName()+"-----消费----"+this.name);
        this.falg=false;
        this.notifyAll();
    }

}

class Shengc implements Runnable{
    private Resource r;
    Shengc(Resource r){
        this.r=r;
    }
    public void run(){
        int x=0;
        while(true){
            r.set("+商品+");
        }

    }
}
class Xiaof implements Runnable{
    private Resource r;
    Xiaof(Resource r){
        this.r=r;
    }
    public void run(){
        while(true){            
            r.get();//r.outInfo();
        }

    }
}




/*    
public synchronized void setInfo(String name){
    if(falg)
        try{this.wait();}catch(Exception e){}
    this.name=name+"..."+count++;
    this.falg=true;
    this.notify();
}
public synchronized void outInfo(){
    if(!falg)
        try{this.wait();}catch(Exception e){}
    System.out.println(this.name);
    this.falg=false;
    this.notify();
}
*/

/*
if(x==0)
    r.setInfo("脉动");
else
    r.setInfo("哇哈哈");
x=(x+1)%2;
*/



---------- android培训、 java培训 、期待与您交流!----------
黑马官网: http://edu.youkuaiyun.com/heima
SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

相关推荐

GPU架构-SIMT

本文深度剖析了GPU的SIMT架构,从硬件实现层面解析其与SIMD的本质差异。SIMT通过将32个线程捆绑为warp执行,在标量编程模型下实现数据并行。文章对比了SIMD和SIMT的执行模型、分支处理机制及存储层次,指出SIMT是对SIMD的虚拟化抽象。重点分析了Volta架构引入的独立线程调度技术,以及访存合并对性能的关键影响。通过定量数据展示了各代GPU架构的寄存器文件规模和线程调度机制,为开发者优化GPU程序提供了硬件层面的理论基础。

技术引领业务创新 973

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 285

【深度剖析】三一重工的数字化转型(中篇)

三一重工在数字化转型方面取得了提高效率、降低成本、加强研发创新和改善内控管理等多方面的成效。本研究旨在通过对三一重工数字化转型的深入分析,引导企业思考在第四次工业革命与第三次能源革命交汇的超级技术窗口期,如何进一步把握发展机遇,并为同行业其他企业提供探索性的建议。作为装备制造行业的佼佼者,三一重工的数字化转型受到了业界的广泛关注。作为行业内首批接触并实践数字化转型的企业之一,三一重工的转型经验不仅成功,而且积累了丰富的理论与实践,为其他制造业企业的数字化转型提供了可借鉴的范例。

领信卓越的博客 2306

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

ARS408毫米波雷达数据解析避坑指南:从硬件连接到Python处理

本文提供了ARS408毫米波雷达从硬件连接到Python数据处理的完整实战指南。针对串口通信不稳定、数据解析错误等常见问题,详细解析了硬件连接方案选择、串口数据高效读取策略、二进制协议解析的位操作技巧,并给出了坐标转换、目标跟踪及实时可视化的代码实现,帮助开发者快速搭建稳定的雷达数据处理流水线。

weixin_29091105的博客 149

ARM Memory Compiler实战指南:从参数配置到GDSII生成的全流程解析

本文详细解析了ARM Memory Compiler在SRAM设计中的全流程应用,从基础参数配置到GDSII文件生成。涵盖SRAM类型选择、核心参数配置策略、高级优化技巧及TSMC 28nm工艺下的实战案例,帮助IC设计工程师高效实现存储器模块的优化设计。

game4的博客 417

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 198

Windows下用Docker快速搭建SearXNG私有搜索引擎(附Dify集成配置)

本文详细介绍了在Windows环境下使用Docker快速搭建SearXNG私有搜索引擎的完整流程,包括环境准备、容器化部署、安全配置优化以及与Dify平台的深度集成方法。通过分步指导和实用配置示例,帮助开发者构建兼具隐私保护和AI增强能力的本地化搜索解决方案,特别适合需要定制化搜索服务的应用场景。

weixin_30300225的博客 336

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 128

DeerFlow 系列教程 第二十篇 | 前端定制与二次开发指南

支持的语言定义在locale.tsLocale 检测采用三级降级策略Cookie 优先:检查localeCookie浏览器语言默认值en-US.value;if (locale!DeerFlow 使用管理主题切换,在根布局中通过主题相关的 CSS 变量定义在中(约 10KB)。: boolean;// 是否支持深度思考。

weixin_43674738的博客 223

Vue3 - Vite运行打包时Uncaught ReferenceError: process is not defined(解决vue3+vite报错process is not defined)

vue3,vite,vue3+vite报错,process,UncaughtReferenceError:processisnotdefined,浏览器控制台报错processisnotdefined解决方法,vue3如何解决报错,vite报错怎么办,前端打包UncaughtReferenceError:processisnotdefined,npmrunbuild打包报错,vite打包时出现错误,vue3打包运行找不到process,热更新会报错UncaughtRefer

🏆 前端领域优质创作者 7737

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

【ARM Trace32(劳特巴赫) 高级篇 20 -- SNOOPer 使用介绍】

在 Lauterbach TRACE32 调试系统中,Snooper是一种特殊的监视工具,它能够在不中断处理器执行的情况下监视和记录特定内存地址的数据变化。这对于系统级调试、性能分析、数据流监视以及实时系统的问题追踪特别有用,尤其是在无法使用中断的情况下。当你设置了一个或多个Snooper时,TRACE32 硬件将不断地监视指定的内存地址,一旦发生了读写操作,就会将相关信息记录下来。这样你就可以看到某个地址的数据是什么时候以及如何被修改的,而不会影响目标系统的运行。

CodingCos的博客 2765

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 498

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 633

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java框架大全

java框架大全

qq_39326137的博客 183

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 360

SecureRandom做随机源,这个Java随机字符串工具类有3个方法

本文分享一款JDK17环境下的Java随机字符串工具类,内置3个开箱即用的方法,全部采用SecureRandom加密安全随机源,不存在弱随机、可预测、取模偏差等问题。工具类支持默认62字符集随机串、纯数字随机串、自定义字符集随机串三种生成模式,支持Unicode码点级别的字符集处理,兼容Emoji等增补字符,边界处理严格,异常信息明确,适合验证码、邀请码、盐值、随机口令、短链码等场景,源码可直接复制使用。

Java后端 | AI智能体应用实战派 | 电脑技能行家 298

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 151

Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

【代码】Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

m0_64476639的博客 328

TRingBuffer两端都能增删(快递站版)

TRingBuffer 是一个支持两端增删、下标访问且容量动态增长的环形双端队列。它通过无符号索引的永不归零设计,利用减法自动模运算实现空满判断与元素计数,避免了传统环形缓冲浪费格子的问题。内部以票号(索引)标记首尾,扩容时重排元素为连续存储,保证 O(1) 操作与高缓存效率。虽不线程安全,但其高效性使其成为游戏开发中事件队列、命令缓冲等场景的理想选择。

u013768914的博客 227

ubuntu安装hadoop系统

本文详细介绍了基于VMware克隆虚拟机搭建三节点Hadoop分布式集群的全过程:使用同一Ubuntu镜像克隆出master、worker1、worker2三台虚拟机,依次配置主机名、固定IP(如192.168.82.10/11/12)、SSH服务及免密登录,确保节点间网络互通。随后安装Java,下载配置Hadoop并分发至各节点,最终初始化启动集群,验证其存储与计算功能,实现高效的大数据环境部署。

qq_43592674的博客 334

Mac上装了最新版本的Android Studio,但是没找到jdk的设置选项也没找到jbr的目录

新版Android Studio(2025.3.1+)因三项变更导致常见问题:一、JDK设置移至“DaemonJVM criteria”,新项目默认自动探测或下载JDK;二、JBR目录改名为带版本号的jbr-21等,需进入.app/Contents/查看,或通过About窗口确认运行时;三、命令行缺adb因platform-tools未加入PATH,需在SDK Manager中勾选并配置~/.zshrc中的ANDROID_HOME及PATH。重装或清理残留可解决缺失问题,切勿手动设JAVA_HOME或安装冲

Programming is a highly artistic endeavor 352

Spring事务和事务传播机制

3. 可重复读(REPEATABLE READ): 事务不会读到其他事务对已有数据的修改, 即使其他事务已提交. 也就可以确保同⼀事务多次查询的结果⼀致, 但是其他事务新插⼊的数据, 是可以感知到的. 这也就引发了幻读问题. 可重复读, 是 MySQL 的默认事务隔离级别.p1事务可以认为是⽗事务, 嵌套事务是⼦事务. ⽗事务出现异常, ⼦事务也会回滚, ⼦事务出现异常, 如果不进⾏处理, 也会导致⽗事务回滚.

txxzjmzlh的博客 205

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 473

读懂 Dart Future:从 async/await 到并发等待

Dart 中的 Future 用于处理异步操作,如网络请求、文件读取等。它表示一次可能延迟完成的计算,成功时返回指定类型值(如 Future<String>),失败时抛出异常。通过 async/await 可以同步式编写异步代码,提升可读性。await 暂停当前函数执行,但不影响事件循环。Future.wait() 可并发等待多个异步任务,timeout() 设置超时限制,catchError() 处理错误。注意:async 不自动开启新线程,耗时计算仍可能阻塞主线程;避免丢弃未处理的 Future,必要时

侯仕奇的博客 356
上一篇: 黑马程序员_Java基础[28]_线程3、优先级、线程组
下一篇: 黑马程序员_Java基础[30]_Lock(synchronized进阶)
Hnotify
博客等级 码龄13年 3粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值