Java多线程3 线程的同步

长短期记忆网络(Long Short-Term Memory networks, LSTM) 如何简单的理解LSTM——其实没有那么复杂: 阅读详情

/*
Java多线程: 线程的生命周期与线程安全

一,线程的分类
Java中的线程分为两类:一种是守护线程,一种是用户线程。 它们在几乎每个方面都是相同的,唯一的区别是判断JVM何时离开。
守护线程是用来服务用户线程的,通过在start()方法前调用thread.setDaemon(true)可以把一个用户线程变成一个守护线程。
Java垃圾回收和异常处理就是典型的守护线程,main方法时用户线程,若JVM中都是守护线程,当前JVM将退出。

二,线程的状态
JDK中用Thread.State类(Thread中的内部枚举类)定义了线程的几种状态
要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,
在它的一个完整的生命周期中通常要经历如下的五种状态:
1新建(NEW):当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
2就绪(RUNNABLE):处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配到CPU资源
3运行(RUNNABLE):当就绪的线程被调度并获得CPU资源时,便进入运行状态, run()方法定义了线程的操作和功能
4阻塞(BLOCKED WAITING TIMED_WAITING):在某种特殊情况下,被人为挂起或执行输入输出操作时,让出 CPU 并临时中止自己的执行,进入阻塞状态
5死亡(TERMINATED):线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致结束

三,线程状态转换涉及到的方法
1,使用new 构造器()新建一个Thread类或者其子类的实例对象,
2,新建状态到就绪状态:start()方法。
3,就绪状态到运行状态:cpu分配资源。
4,运行状态回到就绪状态:失去cpu资源或主动使用yield()方法。
5,运行状态到死亡状态:1run()方法执行完毕,2程序出现error或未处理的Exception,3主动调用stop()方法。
6,运行状态到阻塞状态:1,其他线程调用join()参与此线程,2调用sleep()方法,3调用wait()方法,4等待同步锁时,5调用suspend()方法
7,阻塞状态到就绪状态:2,调用join()方法的线程执行结束,2sleep()到时,3notify()或notifyAll(),4获得同步锁,5resume()方法

四,线程安全问题
出现原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。
解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行,即使当前线程出现阻塞,共享数据也不能被改变

Java对于多线程的安全问题提供了解决方式:同步机制,使用synchronized关键字声明方法或代码块

  1. 同步代码块:
    synchronized (同步监视器){
    // 需要被同步的代码;
    操作共享数据的代码既是需要被同步的代码,
    多个线程共同操作的数据就是共享数据。
    同步监视器就是锁,任何类的对象都可以是锁,但是要求多线程共用一把锁。
    实现Runnable接口的类中可以使用this来当锁,但继承Thread类的子类中
    慎重使用this来当锁,因为锁不唯一。
    }
  2. synchronized还可以放在方法声明中,表示整个方法为同步方法。
    如果操作共享数据的语句都在一个方法体中,可以选择将此方法声明为synchronized。
    public synchronized void show (String name){
    // 需要被同步的代码;
    }

五 同步锁机制:
在《Thinking in Java》中说:对于并发工作,你需要某种方式来防止两个任务访问相同的资源(其实就是共享资源竞争)。
防止这种冲突的方法就是当资源被一个任务使用时,在其上加锁。第一个访问某项资源的任务必须锁定这项资源,
使其他任务在其被解锁之前,就无法访问它了,而在其被解锁之时,另一个任务就可以锁定并使用它了。
5.1 synchronized的锁是什么?
任意对象都可以作为同步锁。所有对象都自动含有单一的锁(监视器)。
同步方法的锁:没有显示指定,默认静态方法(类名.class)、非静态方法(this),
同步代码块:自己指定,很多时候也是指定为this或类名.class

5.2 注意:
必须确保使用同一个资源的多个线程共用一把锁,这个非常重要,否则就无法保证共享资源的安全
一个线程类中的所有静态方法共用同一把锁(类名.class),所有非静态方法共用同一把锁(this),同步代码块(指定需谨慎)

5.3 释放锁的操作
 当前线程的同步方法、同步代码块执行结束。
 当前线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行。
 当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束。
 当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。

5.4 不会释放锁的操作
线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行
线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)。
注意:应尽量避免使用suspend()和resume()来控制线程

5.5同步的范围
1、如何找问题,即代码是否存在线程安全
(1)明确哪些代码是多线程运行的代码
(2)明确多个线程是否有共享数据
(3)明确多线程运行代码中是否有多条语句操作共享数据
2、如何解决
对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行。即所有操作共享数据的这些语句都要放在同步范围中
3、如果范围太小:没锁住所有有安全问题的代码,范围太大:没发挥多线程的功能。

5.6 同步机制的优缺点:
1,优点:解决了线程安全问题
2,缺点:操作同步代码时,只能有一个线程参与,其他线程阻塞,相当于单线程,运行时间变长,效率降低

*/

package leanthread;

import com.sun.org.apache.xpath.internal.objects.XNumber;

/**
 * @Description:
 * @Version:1.0.0.1
 * @Date:2020--03--06--21:57
 * @Author:wisdomcodeinside
 * @E-mail:liwenfeixiaoyao@163.com
 */
public class ThreadTest3 {
    public static void main(String[] args) {
        //测试Runnable实现类中使用同步代码块解决同步问题
        SynchronizedWindow s = new SynchronizedWindow();
        Thread Window1 = new Thread(s);
        Thread Window2 = new Thread(s);
        Thread Window3 = new Thread(s);
        Window1.setName("卖票窗口1");
        Window1.start();
        Window2.setName("卖票窗口2");
        Window2.start();
        Window3.setName("卖票窗口3");
        Window3.start();
        //测试Thread继承子类中使用同步代码块解决同步问题

        for (int i = 0; i < 5; i++) {
            new People(i + "号线程").start();
        }
        //测试Runnable实现类中使用同步方法解决同步问题
        TenMultiple t = new TenMultiple();
        Thread find1 = new Thread(t, "查询线程1");
        Thread find2 = new Thread(t, "查询线程2");
        Thread find3 = new Thread(t, "查询线程3");
        find1.start();
        find2.start();
        find3.start();
        //测试Thread继承子类中使用同步方法解决同步问题
        for (int i = 0; i < 5; i++) {
            new EatFood(i + "号吃货线程").start();
        }

    }
}

//Runnable实现类中使用同步代码块
class SynchronizedWindow implements Runnable {
    private int ticket = 20;//线程共用一个对象,不用加上static
    Object obj = new Object();

    @Override
    public void run() {
//      Object obj = new Object();//不能在此处造锁,会破坏唯一性
        while (true) {
            synchronized (obj) {//或者填入this,使用当前类的对象作为锁,因为使用的时候只创建一个对象,可以保证锁的唯一性
                if (ticket > 0) {
                    try {
                        Thread.sleep(100);//增加阻塞状态,提高非同步情况下的重票几率
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "卖出一张票," + "票号为:" + ticket);
                    ticket--;
                } else {
                    System.out.println("票已卖完,谢谢关照");
                    break;
                }
            }
        }
    }
}

//Thread继承子类中使用同步代码块
class People extends Thread {
    //private static Object obj = new Object();//也可以使用静态属性,保证类的所有对象共用一把锁
    @Override
    public void run() {
        synchronized (People.class) {//或者填入静态属性obj
            //Java中的类也是一个对象,是Class 类的对象,类只会被类加载器加载一次,所以可以保证锁的唯一性
            //使用类名.class的方式调用类对象
            System.out.println(Thread.currentThread().getName() + "天仙下凡");
            try {
                sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "人间失格");
            System.out.println(Thread.currentThread().getName() + "驾鹤西游");
        }
    }

    public People(String name) {
        super(name);
    }
}

//Runnable实现类中使用同步方法
class TenMultiple implements Runnable {
    private int number = 100;

    @Override
    public void run() {
        while(true) {
            FIndNumber();
            if(number <= 0){
                break;
            }
        }
    }

    public synchronized void FIndNumber() {

        if (number % 10 == 0 && number != 0) {
            System.out.println(Thread.currentThread().getName() + "找到一个10的倍数" + number);
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        number--;
    }
}

//Thread继承子类中使用同步方法
class EatFood extends Thread{
    private static int number = 20;
    @Override
    public void run() {
        while(true) {
            eat();
            if (number <= 0){
                break;
            }
        }
    }
    public synchronized static void eat(){
        if(number > 0) {
            System.out.println(Thread.currentThread().getName() + "食用了第" + (21 - number) + "份大碗宽面");
            try {
                sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            number--;
        }else{
            System.out.println("面已经吃完了");
        }
    }

    public EatFood(String name) {
        super(name);
    }
}
//线程安全的单例懒汉式
class Single{
    private static Single single = null;
    private Single(){

    }
    //方式一,直接将方法声明为static synchronized.
//    public static synchronized  Single getInstance(){
//        if(single == null){
//            single = new Single();
//        }
//          return single;
//    }

    //方式二效率更好
    public static Single getInstance(){
        if(single == null) {//如果已经有了对象则不会进入同步代码块,直接返回对象
            synchronized (Single.class) {
                if (single == null) {//同步里面必须再做一次判断,一开始可能有多个线程进行到此处
                    //如果不加判断,后面的线程依然会创建新对象。
                    single = new Single();
                }
            }
        }
        return single;
    }
}
【推荐100个unity插件之10】Unity Cinemachine最全的最详细的虚拟相机介绍,详细案例讲解,快速上手 相信很多同学都用过Unity的Cinemachine插件,使用它可以很方便地实现一些摄像机效果,比如摄像机追踪、推拉镜头、分镜等效果。Cinemachine的知识特别的多又很常用,本来是想做一期来讲一下的,结果搜索发现已经有人做过了,而且内容挺全的,但是内容可能比较啰嗦,还有部分没有补充,所以我就先转载下来,后续有时间再优化修改补充,觉得内容不错的,很欢迎大家去支持原作者。 阅读详情

相关推荐

疲劳容器的定义_FKM规范针对非焊接构件疲劳强度评估实例介绍(下篇)

一、写在前面FKM Inside ANSYS软件,该软件是在FKM 规范的基础上,在ANSYS Workbench内开发的进行非焊接构件及焊缝静强度和疲劳强度评估的工具包。基于ANSYS计算模型的信息,在图形用户界面定义相关设置,利用有限元分析计算结果,自动嵌入FKM规范要求的静强度计算和疲劳强度计算流程和方法,自动将应力结果和相关物理量传递给工具包,无须手动预先选择评估的热点区域,可以...

weixin_35925298的博客 1885

Java多线程——线程同步

文章目录概述解决线程安全问题同步代码块同步方法锁 概述 在Java中,我们可以将多个线程同时运行,这样可以使得代码执行效率提高,并且在实际开发中运用多线程可以解决许多问题。但是,当多个线程同时运行,要对同一数据操作时。可能会引起线程安全问题。 例如: //实现多个窗口买票 class Windos extends Thread{ private static int tit=100; @Override public void run() { while(tit>

qq_61897054的博客 460

从Axure转Figma?这篇编组、缩放、圆角、评论的对比指南帮你无缝切换

本文为资深Axure设计师提供了向Figma无缝迁移的实战指南。文章深度对比了编组、缩放、圆角、评论等核心操作,重点解析了Figma独特的自动布局、组件系统和实时协作功能,旨在帮助用户快速适应新工具,实现设计思维与工作效率的跃迁。

tomato的博客 850

【Java】有 A、B、C 三个线程,如何保证三个线程同时执行?在并发情况下,如何保证三个线程依次执行?如何保证三个线程有序交错执行?

多个线程执行

Siona_xin 的博客 1303

Python入门基础教程(非常详细)

Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;...

Yuki1127918的博客 34万+

实战对比:VINS和ORBSLAM3在无人机避障中的表现(含实测数据)

本文通过实战测试,深度对比了VINS和ORBSLAM3两种主流视觉SLAM算法在无人机避障中的表现。测试聚焦于光照变化、动态遮挡和快速运动三大挑战,提供了详细的实测数据与性能分析。结果表明,VINS在计算效率和实时性上占优,而ORBSLAM3在定位精度和地图管理方面更稳健,为不同应用场景下的工程选型提供了清晰依据。

醉三国 627

Java多线程探究【三线程同步】

ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存请义,在实现线程安全的控制中,比较常用的ReentrantLock,可以显式加锁、释放锁。从JDK5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。接口是控制多个线程对共享资源进行访问的工具。程序相互僵持,一直无法结束。同步锁使用Lock对象充当。

缘友一世的博客 1504

华为ONU远程登录管理配置

华为P602E、EG8040CONU、EG8240H5、W626E等ONU、ONT默认无法配置管理IP,无法远程telnet登录管理。校园网项目中因故障诊断需要远程登录ONU可以通过OLT的远程WEB代理功能链接登录,具体配置如下:

symstandsun的博客 6108

Java多线程2:确保三个线程顺序执行

前言:三个线程t1、t2、t3。确保三个线程顺序执行,t1执行完后t2执行,t2执行完后t3执行。 1、使用join thread.Join 把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程 B 中调用了线程 A 的 join(),直到线程 A 执行完毕后,才会继续执行线程 B。 public class ThreadTest1 { // T1、T2、T3三个线程顺序执行 public static void main(String[] arg

何哥的博客 2399

【嵌入式Linux驱动开发】二十四、Linux I2C 驱动上手尝试

  人的前程关于眼界、关乎格局。   志之所趋,无远弗届,穷山复海不能限也;   志之所向,无坚不入,锐兵精甲不能御也。 一、I2C驱动框架简介   Linux内核将 I2C 驱动分为两部分: ①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 ②、 I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。 1....

悟已往之不谏 知来者之可追 1068

【ubuntu24.04】auto remove后,重启,kernel panic ,please reboot your computer vfs unable to mount root fs

Ubuntu 24.04系统在运行auto remove后出现内核恐慌(kernel panic)无法启动,显示"VFS: unable to mount root fs"错误。该问题是由于当前内核被清除导致系统无法挂载根分区。解决步骤包括:1)尝试用GRUB菜单中的旧内核启动;2)在GRUB中临时编辑启动参数;3)使用Ubuntu启动盘进行chroot修复;4)使用Boot-Repair工具一键修复。成功启动后,需要重新安装linux-generic等元包,重建initramfs并更新

突围 1204

java 之 三个线程交替执行任务

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Condition实现线程间通信 * @author ETHAN * */ public class Thre

ETHAN IN IT 5481

企业级 Token 中转架构设计:高并发、多模型、费用监控一次搞定

摘要:本文针对企业级AI开发中的多模型接口混乱、高并发稳定性差及Token费用失控等痛点,提出一套2026年企业级Token中转架构解决方案。该方案采用五层分层设计(接入层、网关层、调度层、服务层、存储层),实现多模型统一接口、智能路由、高并发限流容错及精细化成本监控。核心功能包括:异构模型标准化接入、动态路由策略(场景/成本/负载/容灾)、多级限流熔断机制、全链路Token计费与安全防封体系(指纹清洗、IP池隔离)。通过分层解耦与模块化设计,企业可降低50%成本、提升99%稳定性,并避免封号风险。文章还提

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 143

java 常用多线程同步_java多线程系列3-线程同步

如果一个资源被多个线程同时访问,可能会遭到破坏,这篇文章介绍java线程同步来解决这类问题引入问题某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售票。方法一:继承Thread类public class SellTicket extendsThread {//定义100张票//private int tickets = 100;//为了让多个线程对象...

weixin_33510225的博客 111

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OV9734 DATASHEET,完整规格书

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

java多线程(3)- 线程同步

文章目录异步与同步两个不安全案例synchronized 异步与同步 多线程由于并发,线程的发生顺序是不可预知的(异步),如:有a,b,c三个线程,那么线程的调度顺序可能时a,b,c;也可能时b,a,c或c,a,b等。处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这个时候我们就需要线程同步,即是让访问此对象的多个线程以某种顺序访问此对象,进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用。 两个不安全案例 下面我们来看看线程异步造成的两个不安全案例: 一.买票问题

weixin_43562942的博客 180

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java基础(3)——多线程(3)线程同步

文章目录线程同步(重点)同步方法、同步代码块死锁Lock 线程同步(重点) 多个线程操作同一个资源 并发:同一个对象被多个线程同时操作 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改此对象,这式就需要线程同步,线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的对象等待池形成队列。等待前面的线程使用完毕,下一个线程再使用 同步的条件:队列+锁 由于同一个进程的多个线程访问同一块存储空间,在带来方便的同时,也带来了访问的冲突问题,为了确保数据的正确访问,在访问时加入锁机制s

赶路de人的博客 715

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java多线程初级(3):线程同步

一、引入 我们直接看简单又亲切的的代码解释一下为什么要使用线程同步: 我们用多个线程同时执行这段代码: num++; 我们未使用线程同步代码如下: public class demo { public static void main(String[] args) { AddSum addSum = new AddSum(); //创建业务对象 for (int i = 0; i < 10000; i++) { new Thread((

Whirlwind_boy的博客 206

java 多线程 3 synchronized 同步

多任务编程的难点在于多任务共享资源。对于同一个进程空间中的多个线程来说,它们都共享堆中的对象。某个线程对对象的操作,将影响到其它的线程。 在多线程编程中,要尽力避免竞争条件(racing condition),即运行结果依赖于不同线程执行的先后。线程是并发执行的,无法确定线程的先后,所以我们的程序中不应该出现竞争条件。 然而,当多任务共享资源时,就很容易造成竞争条件。我们需要将共享资...

axg81207的博客 162

Java多线程编程(3)- 线程同步

Java

数智技术 572

Java多线程 3 线程同步

在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系。可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题。现在就来学习多线程对数据访问的控制吧。    由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。   ...

weixin_33875839的博客 107

Java多线程系列3(线程同步)

1 为什么要线程同步竞态条件:如果计算的结果取决于多个线程的执行顺序,那么就会发生金态条件。常见的竞态条件是:先检测后执行,执行依赖于检测的结果。检测的结果又依赖于线程实际的执行顺序,这样,就可能出现顺序不一样时,检测的结果不一样,从而导致执行结果不一样。 多线程访问同一个资源,如果出现竞态条件,结果就不是确定的,此时就需要考虑线程同步。2 多线程出错例子看一下下面这个例子:多个线程对同一个变量执

tencent_hw的博客 366

Java多线程随笔(3):线程同步

线程同步 多个线程访问同一个对象,并且某些线程还想修改这个对象,这个时候就需要线程同步; 线程同步就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池,形成队列,等待前面线程使用完毕,下一个线程再使用; 形成条件:队列+锁(synchronized) 不安全案例 ...

AVOP_210的博客 1173

java多线程同步互斥_【转】java多线程详解(3)-线程的互斥与同步

我们知道访成员变量有线程安全问题,在多线程程序中我们可以通过使用synchronized关键字完成线程的同步,能够解决部分线程安全问题在java中synchronized同步关键字可以使用在静态方法和实例方法中使用,两者的区别在于:对象锁与类锁对象锁当一个对象中有synchronized method或synchronized block的时候调用此对象的同步方法或进入其同步区域时,就必须先获得对...

weixin_42665725的博客 278

Java多线程:线程同步——实验3

原文地址: http://blog.youkuaiyun.com/huang_xw/article/details/7318554 /** * @Description: 两个线程(线程1与线程2)访问同一个对象的内同步方法syn1()与同步方法syn2() * 结果: 线程1访问对象sameObj的同步方法syn1()时, 线程2访问对象sameObj中的同步方法syn2()阻塞. 或者

清风小阁 2580

java多线程协调与同步实例_Java多线程(3)——线程同步

线程同步线程同步机制 是一套用于协调线程间的数据访问(data access)及活动(activity)的机制,该机制用于保障线程安全以及实现这些线 程的共同目标。如果把线程比作在公路上行驶的车辆, 那么线程同步机制就好比是任何车辆都需要遵循的交通规则。实现线程同步:锁volatilefinalstaticAPI锁volatileCASfinalstatic原子性保障是变量读写操作本身的原子性是可...

weixin_39562606的博客 270

Java多线程[3]:线程同步(互斥)

当两个或多个线程需要访问共享资源时,它们需要以某种方式确保每次只有一个线程使用资源,实现这一目的的过程称为线程同步。Java为线程同步提供了很好的支持。 监视器的概念常用来解决线程同步问题。监视器是用做互斥锁的对象。在任何时刻,只有一个线程可以拥有监视器。当线程取得锁时,也就进入了监视器。其它所有企图进入加锁监视器的线程都会被挂起,直到第一个线程退出监视器。

朱登凯的专栏 1403
上一篇: Java多线程2 线程创建的两种方式与Thread类常用方法
wisdomcodeinside
博客等级 码龄7年 29粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值