黑马程序员_日记14_Java多线程(四)

日记APP源码和设计报告(包调试成功) 通达学院2022/2023 学年 第 一 学期实验模 块 名 称 Android课程专 业 通信工程(嵌入式培养)学 生 班 级学 生 学 号学 生 姓 名指 导 教 师目 录一、熟悉Android开发环境安装与配置11、 基本要求12、 安装与配置过程13、 调试过程及结果。 阅读详情

 ——- android培训、java培训、期待与您交流! ———-

同步函数的锁是this

同步函数用的是哪一个锁呢?

通过下列程序进行验证。

使用两个线程来买票。
一个线程在同步代码块中。
一个线程在同步函数中。
都在执行买票动作。

class Ticket implements Runnable
{
    private  int tick = 100;
    Object obj = new Object();
    boolean flag = true;
    public  void run()
    {
        if(flag)
        {
            while(true)
            {
                synchronized(obj)
                {
                    if(tick>0)
                    {
                        try{Thread.sleep(10);}catch(Exception e){}
                        System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
                    }
                }
            }
        }
        else
            while(true)
                show();
    }
    public synchronized void show()//this
    {
        if(tick>0)
        {
            try{Thread.sleep(10);}catch(Exception e){}
            System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
        }
    }
}


class  ThisLockDemo
{
    public static void main(String[] args) 
    {

        Ticket t = new Ticket();

        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        t1.start();
        t.flag = false;
        t2.start();

    }
}

运行结果:
Thread-1….show…. : 100
Thread-1….show…. : 99
Thread-0….show…. : 98
Thread-0….show…. : 97
Thread-0….show…. : 96
Thread-0….show…. : 95
Thread-0….show…. : 94
Thread-0….show…. : 93
Thread-0….show…. : 92
Thread-0….show…. : 91
Thread-0….show…. : 90
Thread-0….show…. : 89
Thread-0….show…. : 88
Thread-0….show…. : 87
Thread-0….show…. : 86
Thread-0….show…. : 85
Thread-0….show…. : 84
Thread-0….show…. : 83
Thread-0….show…. : 82
Thread-0….show…. : 81
Thread-0….show…. : 80
Thread-0….show…. : 79
Thread-0….show…. : 78
Thread-1….show…. : 77
Thread-1….show…. : 76
Thread-1….show…. : 75
Thread-1….show…. : 74
Thread-1….show…. : 73
Thread-1….show…. : 72
Thread-1….show…. : 71
Thread-1….show…. : 70
Thread-1….show…. : 69
Thread-1….show…. : 68
Thread-1….show…. : 67
Thread-1….show…. : 66
Thread-1….show…. : 65
Thread-1….show…. : 64
Thread-1….show…. : 63
Thread-1….show…. : 62
Thread-1….show…. : 61
Thread-1….show…. : 60
Thread-1….show…. : 59
Thread-1….show…. : 58
Thread-1….show…. : 57
Thread-1….show…. : 56
Thread-1….show…. : 55
Thread-1….show…. : 54
Thread-1….show…. : 53
Thread-1….show…. : 52
Thread-1….show…. : 51
Thread-1….show…. : 50
Thread-1….show…. : 49
Thread-1….show…. : 48
Thread-1….show…. : 47
Thread-1….show…. : 46
Thread-1….show…. : 45
Thread-1….show…. : 44
Thread-1….show…. : 43
Thread-1….show…. : 42
Thread-1….show…. : 41
Thread-1….show…. : 40
Thread-1….show…. : 39
Thread-1….show…. : 38
Thread-1….show…. : 37
Thread-1….show…. : 36
Thread-1….show…. : 35
Thread-1….show…. : 34
Thread-1….show…. : 33
Thread-1….show…. : 32
Thread-1….show…. : 31
Thread-1….show…. : 30
Thread-1….show…. : 29
Thread-1….show…. : 28
Thread-1….show…. : 27
Thread-1….show…. : 26
Thread-1….show…. : 25
Thread-1….show…. : 24
Thread-1….show…. : 23
Thread-1….show…. : 22
Thread-1….show…. : 21
Thread-1….show…. : 20
Thread-1….show…. : 19
Thread-1….show…. : 18
Thread-1….show…. : 17
Thread-1….show…. : 16
Thread-1….show…. : 15
Thread-1….show…. : 14
Thread-1….show…. : 13
Thread-1….show…. : 12
Thread-1….show…. : 11
Thread-1….show…. : 10
Thread-1….show…. : 9
Thread-0….show…. : 8
Thread-0….show…. : 7
Thread-0….show…. : 6
Thread-0….show…. : 5
Thread-0….show…. : 4
Thread-0….show…. : 3
Thread-0….show…. : 2
Thread-0….show…. : 1

结果显示:两个线程都只是调用了show方法,为什么呢??
因为start方法仅仅是把线程创建,线程还没有运行。
当主线程执行完毕的时候,flag=false;两个线程只会调用show方法。

下面让主线程睡10毫秒,测试一下

class Ticket implements Runnable
{
    private  int tick = 100;
    Object obj = new Object();
    boolean flag = true;
    public  void run()
    {
        if(flag)
        {
            while(true)
            {
                synchronized(obj)
                {
                    if(tick>0)
                    {
                        try{Thread.sleep(10);}catch(Exception e){}
                        System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
                    }
                }
            }
        }
        else
            while(true)
                show();
    }
    public synchronized void show()//this
    {
        if(tick>0)
        {
            try{Thread.sleep(10);}catch(Exception e){}
            System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
        }
    }
}


class  ThisLockDemo
{
    public static void main(String[] args) 
    {

        Ticket t = new Ticket();

        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        t1.start();
        try{Thread.sleep(10);}catch(Exception e){}
        t.flag = false;
        t2.start();

    }
}

运行结果是:
Thread-0….code : 100
Thread-1….show…. : 99
Thread-0….code : 98
Thread-1….show…. : 97
Thread-0….code : 96
Thread-1….show…. : 95
Thread-0….code : 94
Thread-1….show…. : 93
Thread-0….code : 92
Thread-1….show…. : 91
Thread-0….code : 90
Thread-1….show…. : 89
Thread-0….code : 88
Thread-1….show…. : 87
Thread-0….code : 86
Thread-1….show…. : 85
Thread-0….code : 84
Thread-1….show…. : 83
Thread-0….code : 82
Thread-1….show…. : 81
Thread-0….code : 80
Thread-1….show…. : 79
Thread-0….code : 78
Thread-1….show…. : 77
Thread-0….code : 76
Thread-1….show…. : 75
Thread-0….code : 74
Thread-1….show…. : 73
Thread-0….code : 72
Thread-1….show…. : 71
Thread-0….code : 70
Thread-1….show…. : 69
Thread-0….code : 68
Thread-1….show…. : 67
Thread-0….code : 66
Thread-1….show…. : 65
Thread-0….code : 64
Thread-1….show…. : 63
Thread-0….code : 62
Thread-1….show…. : 61
Thread-0….code : 60
Thread-1….show…. : 59
Thread-0….code : 58
Thread-1….show…. : 57
Thread-0….code : 56
Thread-1….show…. : 55
Thread-0….code : 54
Thread-1….show…. : 53
Thread-0….code : 52
Thread-1….show…. : 51
Thread-0….code : 50
Thread-1….show…. : 49
Thread-0….code : 48
Thread-1….show…. : 47
Thread-0….code : 46
Thread-1….show…. : 45
Thread-0….code : 44
Thread-1….show…. : 43
Thread-0….code : 42
Thread-1….show…. : 41
Thread-0….code : 40
Thread-1….show…. : 39
Thread-0….code : 38
Thread-1….show…. : 37
Thread-0….code : 36
Thread-1….show…. : 35
Thread-0….code : 34
Thread-1….show…. : 33
Thread-0….code : 32
Thread-1….show…. : 31
Thread-0….code : 30
Thread-1….show…. : 29
Thread-0….code : 28
Thread-1….show…. : 27
Thread-0….code : 26
Thread-1….show…. : 25
Thread-0….code : 24
Thread-1….show…. : 23
Thread-0….code : 22
Thread-1….show…. : 21
Thread-0….code : 20
Thread-1….show…. : 19
Thread-1….show…. : 18
Thread-0….code : 17
Thread-1….show…. : 16
Thread-0….code : 15
Thread-1….show…. : 14
Thread-0….code : 13
Thread-1….show…. : 12
Thread-0….code : 11
Thread-1….show…. : 10
Thread-0….code : 9
Thread-1….show…. : 8
Thread-0….code : 7
Thread-1….show…. : 6
Thread-0….code : 5
Thread-1….show…. : 4
Thread-0….code : 3
Thread-1….show…. : 2
Thread-0….code : 1
Thread-1….show…. : 0

出现了错票,说明不安全。
至少可以肯定的是同步函数用的锁不是obj。
那么同步函数的锁是什么呢??
函数需要被对象调用。那么函数都有一个所属对象引用。就是this。
所以同步函数使用的锁是this。

下面把锁obj改为this

class Ticket implements Runnable
{
    private  int tick = 100;
    Object obj = new Object();
    boolean flag = true;
    public  void run()
    {
        if(flag)
        {
            while(true)
            {
                synchronized(this)
                {
                    if(tick>0)
                    {
                        try{Thread.sleep(10);}catch(Exception e){}
                        System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
                    }
                }
            }
        }
        else
            while(true)
                show();
    }
    public synchronized void show()//this
    {
        if(tick>0)
        {
            try{Thread.sleep(10);}catch(Exception e){}
            System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
        }
    }
}


class  ThisLockDemo
{
    public static void main(String[] args) 
    {

        Ticket t = new Ticket();

        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        t1.start();
        try{Thread.sleep(10);}catch(Exception e){}
        t.flag = false;
        t2.start();

    }
}

经过多次测试,没有发现错票!
说明同步函数使用的锁是this。

静态同步函数的锁是Clsaa对象

如果同步函数被静态修饰后,使用的锁是什么呢?

和上面一样,我们用程序来求解。

class Ticket implements Runnable
{
    private static  int tick = 100;
    //Object obj = new Object();
    boolean flag = true;
    public  void run()
    {
        if(flag)
        {
            while(true)
            {
                synchronized(this)
                {
                    if(tick>0)
                    {
                        try{Thread.sleep(10);}catch(Exception e){}
                        System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
                    }
                }
            }
        }
        else
            while(true)
                show();
    }
    public static synchronized void show()
    {
        if(tick>0)
        {
            try{Thread.sleep(10);}catch(Exception e){}
            System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
        }
    }
}


class  StaticMethodDemo
{
    public static void main(String[] args) 
    {

        Ticket t = new Ticket();

        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        t1.start();
        try{Thread.sleep(10);}catch(Exception e){}
        t.flag = false;
        t2.start();


    }
}

运行结果又出现了0号票,又出现了错票,说明程序不安全,
说明静态函数的锁不是this。

通过验证,发现不在是this。因为静态方法中也不可以定义this。

静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是Class

下面来验证一下:
将this锁换成Ticket.class

class Ticket implements Runnable
{
    private static  int tick = 100;
    //Object obj = new Object();
    boolean flag = true;
    public  void run()
    {
        if(flag)
        {
            while(true)
            {
                synchronized(Ticket.class)
                {
                    if(tick>0)
                    {
                        try{Thread.sleep(10);}catch(Exception e){}
                        System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
                    }
                }
            }
        }
        else
            while(true)
                show();
    }
    public static synchronized void show()
    {
        if(tick>0)
        {
            try{Thread.sleep(10);}catch(Exception e){}
            System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
        }
    }
}


class  StaticMethodDemo
{
    public static void main(String[] args) 
    {

        Ticket t = new Ticket();

        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        t1.start();
        try{Thread.sleep(10);}catch(Exception e){}
        t.flag = false;
        t2.start();


    }
}

经过多次 运行,没有发现错票。

静态的同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class

华为云HCS解决方案笔记HUAWEI CLOUD Stack【面试篇】 华为云解决方案介绍、华为云服务介绍,华为云网络平面规划等 阅读详情

相关推荐

空间节省算法在Rowhammer防御中的应用与优化

空间节省算法(Space-Saving)是一种高效的流式数据处理算法,主要用于在有限内存条件下实时识别数据流中的高频项。其核心原理是通过维护固定大小的计数器表,动态跟踪最活跃的元素,适用于处理无限数据流场景。该算法在内存安全领域具有重要价值,特别是在Rowhammer攻击防御中,能够有效检测异常高频访问的DRAM行地址。通过结合计数器衰减策略(如DSAC)和混合架构设计,空间节省算法可以在保证低硬件开销的同时,提供高精度的攻击检测能力。这些技术已成功应用于现代DDR5内存控制器,展现出优异的工程实践价值。

weixin_31139479的博客 606

日记本-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

编写一个日记本功能的程序,使用字节流经日记的具体信息记录在本地的txt文件中。当用户输入日记的特定内容后,会将输入的内容保存至本地的txt文件中。需要输入的内容包括“姓名”,“天气”、“标题”、“内容”的数据。保存的时候需要判断本地是否存在文件,如果存在则追加,不存在则新建。文件命名格式为“黑马日记本”加上“.txt”后缀,如“黑马日记本.txt”

芝麻的博客 6281

手把手教你自制Type-C OTG转换器(附电路图及避坑指南)

本文详细指导如何自制Type-C OTG转换器,包括核心电路设计、元器件选型及焊接技巧,特别强调硬件检测电路的关键作用。通过实测数据和避坑指南,帮助开发者解决兼容性问题,实现高效数据传输。

weixin_27038245的博客 712

黑马程序员日记-1

因为自己是计算机专业的,平时也有些积累,黑马入学流程又需要学员的学习日记,刚好把原来的笔记再整理一番。。。笔记是自己写的,肯定有不严谨甚至错误的地方,但是自己总结的笔记总比直接抄来的记忆深刻。就比如我认为对付大多数考JAVA标识符命名规则的题,我认为大多数题都有两个特点: * 只要不以数字开头,中间没有空格和特殊字符就行 * _ 下划线,$ 开头都可以 这个答案肯定不能涵盖所有情况,这也

sinat_32832713的博客 549

告别城市峡谷定位漂移:手把手教你用PSINS仿真INS/NHC/ODO组合导航(附代码获取)

本文详细解析了INS/NHC/ODO组合导航系统在城市峡谷环境中的应用,通过PSINS平台实现精准定位。文章涵盖核心原理、环境搭建、算法实现及性能优化,帮助开发者解决GNSS信号中断时的定位漂移问题,提升自动驾驶系统在复杂环境中的可靠性。

weixin_30329623的博客 429

【OpenClaw从入门到精通】第45篇:Skill供应链安全——如何识别并避开恶意技能插件?(2026实测版)

随着OpenClaw生态爆发式增长,全球Skills总量近75万个,日均新增2.1万个,但恶意/问题插件已超600个,数十万用户受影响。本文基于奇安信威胁报告及360安全实践,拆解恶意技能的五大核心特征,提出"安装前三步法"安全审查流程,详解安全技能来源白名单与定期审计方案,并深度解析360龙虾Skill安全超市的分级认证机制。读者可掌握从技能筛选、安装审查到术后审计的全流程安全防护手段,通过实操命令与案例演示,零成本构建Skill供应链安全防线,避免遭遇私钥窃取、资产损失等安全事件。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 561

黑马程序员日记-14

单选题: 1.   下列哪个声明是错误的?(B) A.  int i=10; B. float  f=1.1; C.  double d=34.4; D.  byte b=127;   2.   下面哪个不是java中的关键字?(C) A.  public B.  true C. main D.  class   3.   下面哪个语句不会产生编译错误?( C ) A

sinat_32832713的博客 531

ABB变频器使用PROFINET IO通信模块时的激活方法

ABB变频器使用PROFINET IO通信模块时的激活方法

Robot_PLC_HMI_Automation 2732

黑马程序员--Java学习日记之多线程

------- android培训、java培训、期待与您交流! ---------- 多线程的引入 1.什么是线程      线程是程序执行的一条路径, 一个进程中可以包含多条线程      多线程并发执行可以提高程序的效率, 可以同时完成多项工作  2.多线程的应用场景      红蜘蛛同时共享屏幕给多个电脑      迅雷开启多条线程一起下载      QQ同时和多个人一起视

MH_LZX001的博客 508

大模型之Spring AI实战系列(二十六):Spring Boot + DeepSeek 实战指南:构建AI聊天应用

在人工智能技术飞速发展的今天,大型语言模型已经成为了推动技术创新的重要力量。DeepSeek作为国内领先的大型语言模型提供商,其推出的DeepSeek系列模型在多个领域都展现出了卓越的性能。本文将详细介绍如何使用Spring Boot框架集成DeepSeek API,构建一个简单的AI聊天应用。我们将实现两个核心功能:普通文本生成和流式文本生成。

寻道AI,探索AI无限可能! 2258

OpenClaw终于有了图形界面,一键安装使用你的24小时AI 研究助手!

ClawX是连接强大 AI 智能体与普通用户之间的桥梁。基于OpenClaw构建,它将命令行式的 AI 编排转变为易用、美观的桌面体验——无需使用终端。无论是自动化工作流、连接通讯软件,还是调度智能定时任务,ClawX 都能提供高效易用的图形界面,帮助你充分发挥 AI 智能体的能力。ClawX 预置了最佳实践的模型供应商配置,原生支持 Windows 平台以及多语言设置。当然,你也可以通过设置 → 高级 → 开发者模式来进行精细的高级配置。

Maynor的博客 3391

黑马程序员--【学习日记四】——java面向对象(二)

1)单例设计模式 1: 1: class Single{ 2: 2: private Single(){}; 3: 3: static Single s = new Single(); 4: 4: static Single getInstance(){ 5: 5: return s; 6: 6: } 7

u013587258的专栏 537

扩散模型中的UNET

一、为什么UNET模型可以用于去噪网络 二、扩散模型中的UNET是一个条件去噪网络,怎么实现的 三、UNET用于分割和用去去噪的区别

m0_37737957的博客 3816

【黑马点评日记】项目中的UV统计实现:HyperLogLog百万数据实测,内存仅占14KB

摘要:本文介绍了使用Redis的HyperLogLog数据结构实现高效UV统计的方案。相比传统Set或数据库方案,HyperLogLog仅需14KB内存即可统计百万级UV数据,误差率仅0.24%。文章详细分析了HyperLogLog的核心原理、内存占用对比、代码实现示例,并给出了项目中的架构设计和业务层代码。该方案在保证统计精度的同时,内存消耗仅为Set方案的1/1000,是典型的空间换时间优化案例,适用于对精度要求不高的UV统计场景。

任岁月风干理想再也找不回真的我 1155

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

黑马程序员 日记(六)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-   黑马程序员 日记(六) OC基础小知识点 1.#import和#include 相同点:都是引入头文件 不同点:import   引入的头文件可以防止重复包含

los_l_t_f的博客 298

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

黑马程序员java学习日记2

public class Test { //成员变量是在类体的变量部分中定义的变量,也称为属性。 int c = 12; public static void main(String [] args){ //声明了一个变量, 局部变量 int a = 12; a = 15; System.out.println(a); //变量的作用域是变量的生命期和作用范围

黑马程序员学习 454

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

黑马程序员-----java多线程(学习日记)

--------android培训、java培训、期待与您交流! ----------  首先讲一下进程和线程的区别:     进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。     线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。     线程和进程一样分为五个阶段:创

nether009的专栏 473

黑马程序员--【学习日记五】——多线程

线程与进程线程安全死锁线程间通信等待唤醒机制停止线程守护线程、join方法、优先级,yield 1)线程与进程: 进程:是一个正在执行中的程序。一个控制单元。 线程:就是进程中的一个独立的控制单元,线程控制进程的执行。 一个进程中至少有一个线程。 自定义线程方式一,继承Thread 步骤:  1,定义类继承Thread。  2,复写Thread类中的run方法

u013587258的专栏 487

安卓期末大作业——日记APP

2022/2023 学年 第 一 学期课程设计 实验报告模 块 名 称 Android课程设计专 业 通信工程(嵌入式培养)学 生 班 级学 生 学 号学 生 姓 名指 导 教 师1、 基本要求12、 安装与配置过程13、 调试过程及结果分析14、 体会11、 设计22、 实现方法23、 调试过程及结果分析24、 体会2。

科大云炬 1万+

黑马程序员_Java学习日记第一天-Java基础

------- android培训、java培训、期待与您交流! --------- Java程序设计基本规则    Java程序区分大小写    花括号用来区分一组语句    程序必须以类的形式存在,一个程序执行必须包含如下语句 public className   //类名为Name {   //类名第一个字母大写,文件名与main方法所在public类的类名相同 publics

ty163yu998的专栏 662

黑马程序员--Java学习日记之GUI&网络编程

------- android培训、java培训、期待与您交流! ---------- GUI 如何创建一个窗口并显示  Graphical User Interface(图形用户接口)。    Frame f = new Frame(“my window”); f.setLayout(new FlowLayout());//设置布局管理器

MH_LZX001的博客 552

黑马程序员--Java学习日记之网络编程

                                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、网络编程概述 1、计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网

Memor_的博客 896

安卓APP源码和设计报告——日记APP

通达学院2022/2023 学年 第 一 学期实验报告模 块 名 称 Android课程设计专 业 通信工程(嵌入式培养)学 生 班 级学 生 学 号学 生 姓 名指 导 教 师设计题目熟悉–BUNDLE––X86或–STUDIO–应用环境:安装建立 ADT-BUNDLE-WINDOWS-X86或ANDROID-STUDIO-IDE的应用开发环境实验。

安卓精品项目源码 808

黑马程序员_Java学习日记14_IO流3

----------------------android培训、java培训、期待与您交流! --------------------- 1.IO流,字节流File读写操作 字符流: FileReader FileWriter。 BufferedReader BufferedWriter 字节流: InputStream  OutputStream 需求,想要操作图片数据

cdestiny的专栏 447

黑马程序员-学习日记(多线程间的通信)

------Java EE培训、Android培训、iOS培训、期待与您交流! ------- 示例: //将资源封装成对象 class Resour { String name; String gender; } //将线程执行的任务封装成对象 class Input implements Runnable { private Res...

weixin_30569033的博客 86

黑马程序员java学习日记十一 IO流

一、IO流的三种分类方式 1.按流的方向分为:输入流和输出流 2.按流的数据单位不同分为:字节流和字符流 3.按流的功能不同分为:节点流和处理流 二、IO流的四大抽象类: 字符流:Reader Writer 字节流:InputStream(读数据) OutputStream(写数据) 三、缓冲流:缓冲流要套接在相应的节点流之上,提高了读写的效率。 此处理流的构造方法都得传相对应的

u011532797的专栏 613
上一篇: 黑马程序员_日记13_Java多线程(三)
下一篇: 黑马程序员_日记15_Java多线程(五)
回到未来2020
博客等级 码龄12年 27粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值