Java基础知识(十一)--多线程

Java多线程编程详解 Java 的多线程编程为开发高效并发程序提供了强大的支持。从线程的创建、生命周期管理,到线程同步与通信,再到线程池的使用,每个环节都有相应的工具和方法。掌握这些知识不仅能提高程序的执行效率,还能有效地解决复杂的并发问题。希望这篇文章能帮助你更好地理解 Java 多线程编程。如果有任何问题或进一步的讨论,欢迎随时交流。本文已收录于,我的技术网站,有大厂完整面经,工作技术,架构师成长之路,等经验分享。 阅读详情

微信公众号:Java患者
专注Java领域技术分享

多线程(同步方法)

  • 使用synchronized关键字修饰一个方法,该方法中所有的代码都是同步的

class Printer {
 public static void print1() {
  synchronized(Printer.class){    //锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象
   System.out.print("程");
   System.out.print("序");
   System.out.print("员");
   System.out.print("\r\n");
  }
 }
 /*
  * 非静态同步函数的锁是:this
  * 静态的同步函数的锁是:字节码对象
  */
 public static synchronized void print2() { 
  System.out.print("码");
  System.out.print("农");
  System.out.print("\r\n");
 }
}

多线程安全问题

  • 多线程并发操作同一数据时,就有可能出现线程安全问题

  • 使用同步技术可以解决这种问题,把操作数据的代码进行同步,不要多个线程一起操作

public class Demo2_Synchronized {

  /**
   * @param args
   * 需求:铁路售票,一共100张,通过四个窗口卖完.
   */
  public static void main(String[] args) {
   TicketsSeller t1 = new TicketsSeller();
   TicketsSeller t2 = new TicketsSeller();
   TicketsSeller t3 = new TicketsSeller();
   TicketsSeller t4 = new TicketsSeller();
   
   t1.setName("窗口1");
   t2.setName("窗口2");
   t3.setName("窗口3");
   t4.setName("窗口4");
   t1.start();
   t2.start();
   t3.start();
   t4.start();
  }
 
 }
 
 class TicketsSeller extends Thread {
  private static int tickets = 100;
  static Object obj = new Object();
  public TicketsSeller() {
   super();
   
  }
  public TicketsSeller(String name) {
   super(name);
  }
  public void run() {
   while(true) {
    synchronized(obj) {
     if(tickets <= 0) 
      break;
     try {
      Thread.sleep(10);//线程1睡,线程2睡,线程3睡,线程4睡
     } catch (InterruptedException e) {
      
      e.printStackTrace();
     }
     System.out.println(getName() + "...这是第" + tickets-- + "号票");
    }
   }
  }
 }
  • 死锁

    • 多线程同步的时候,如果同步代码嵌套,使用相同锁,就有可能出现死锁

多线程(单例设计模式)

  • 单例设计模式: 保证类在内存中只有一个对象

  • 如何保证类在内存中只有一个对象呢?

    • 控制类的创建,不让其他类来创建本类的对象. private

    • 在本类中定义一个本来的对象,Singleton s

    • 提供公共的访问方式.

  • 单例写法

    //饿汉式
    class Singleton {
      //1,私有构造函数
      private Singleton(){}
      //2,创建本类对象
      private static Singleton s = new Singleton();
      //3,对外提供公共的访问方法
      public static Singleton getInstance() {
        return s;
      }
    
      public static void print() {
        System.out.println("11111111111");
      }
    }
    
    //懒汉式,单例的延迟加载模式
    class Singleton {
     //1,私有构造函数
     private Singleton(){}
     //2,声明一个本类的引用
     private static Singleton s;
     //3,对外提供公共的访问方法
     public static Singleton getInstance() {
      if(s == null)
       //线程1,线程2
       s = new Singleton();
      return s;
     }
     
     public static void print() {
      System.out.println("11111111111");
     }
    }
    
    class Singleton {
      private Singleton() {}
    
      public static final Singleton s = new Singleton();//final是最终的意思,被final修饰的变量不可以被更改
    }
    

资料 · 福利

回复 【Java】即可获取最新零基础Java视频资料

回复 【激活】即可获取IDEA、datagrip等系统激活方式

回复 【面试题】即可获取Java技术相关面试题

往期 · 精彩

专注分享Java技术,跟我一起学习吧

长按识别二维码关注

JAVA多线程基础知识总结 JAVA线程 程序,进程,线程 程序:为了完成特定任务,用某种语言编写的一组指令集和,即指一段静态代码,静态对象 进程:后台在运行的程序,程序的一次执行过程,比如QQ.exe,有其自身的生命周期:产生、存在和消亡的过程,程序是静态的,进程是动态的,进程作为资源分配的范围,系统在运行时会为每一个进程分配不同的内存区域。 线程:进程中的每个活动—线程,比如说QQ中的各项操作应用,同时进行聊天,语音,文... 阅读详情

相关推荐

【Java篇】多线程详解

Java系统在语言层次上对多线程直接提供支持,多线程的主要目的是将一个程序中的各个程序段并发化,在在通常情况下,Java程序各部分是按顺序一次执行的,由于某种原因,需要将这些按顺序执行的程序段转化为并发执行,每个程序段在逻辑上是相互完整的代码段。实际上,在单处理器上,同一时刻只能执行一个代码,但是在同一时间段内,这些代码交替执行,所谓的“微观串行,宏观并行”。...

zhangxia_的博客 1万+

Java开发基础面试题,最新阿里Java高级面试题及答案,吐血整理

前言 进程和线程的提出极大的提高了操作提供的性能。进程让操作系统的并发性成为了可能,而线程让进程的内部并发成为了可能。 多进程的方式也可以实现并发,为什么我们要使用多线程? 多进程方式确实可以实现并发,但使用多线程,有以下几个好处: 进程间的通信比较复杂,而线程间的通信比较简单,通常情况下,我们需要使用共享资源,这些资源在线程间的通信比较容易。 进程是重量级的,而线程是轻量级的,故多线程方式的系统开销更小。 由此可见多线程的学习对程序员来说是至关重要的,这也是为什么不论是大大小小的公司面试官都会问到的问

m0_56604931的博客 422

手把手教你配置SAP EWM HU类型及号段分配(含常见错误排查)

本文详细介绍了SAP EWM系统中HU类型及号段分配的配置方法,包括环境准备、包材主数据配置、存储类型关联及号段管理。通过实战案例和常见错误排查,帮助用户高效完成HU配置,提升仓储管理效率。重点讲解了EWM后台配置和号段配置的关键步骤与技巧。

weixin_33670786的博客 442

简直无敌!火遍全网的“多线程核心技术”(金九银十突击版),他来了

进程和线程的提出极大的提高了操作提供的性能。进程让操作系统的并发性成为了可能,而线程让进程的内部并发成为了可能。 多进程的方式也可以实现并发,为什么我们要使用多线程? 多进程方式确实可以实现并发,但使用多线程,有以下几个好处: 进程间的通信比较复杂,而线程间的通信比较简单,通常情况下,我们需要使用共享资源,这些资源在线程间的通信比较容易。 进程是重量级的,而线程是轻量级的,故多线程方式的系统开销更小。 由此可见多线程的学习对程序员来说是至关重要的,这也是为什么不论是大大小小的公司面试官都会问到的问题。金

lonely_bin的博客 232

从Reset到Read:深入解析Rolling Shutter曝光流水线

本文深入解析Rolling Shutter(卷帘曝光)的工作原理,重点探讨Reset和Read信号在图像传感器中的关键作用。通过Reset-Read流水线机制,详细解释了曝光控制、时序调优及运动伪影补偿等核心技术,帮助读者理解卷帘曝光在高速摄影和动态场景中的应用。

weixin_42531925的博客 253

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 750

Java多线程基础知识总结

<-----------------------------------------廖雪峰学Java-----------------------------------------> 目录1. 多线程基础知识2. 创建多线程3. 线程状态4. 中断线程5. 守护线程6. 线程同步7. 同步方法8. 死锁9. 使用wait和notify10. 使用ReentrantLock11. 使用Condition12. 使用ReadWriteLock13. 使用StampedLock14. 使用Concu

Pinkgranite86的博客 2721

BK3437蓝牙5.2芯片实战:手把手教你设计超低功耗智能家居遥控器(附原理图)

本文详细介绍了BK3437蓝牙5.2芯片在超低功耗智能家居遥控器设计中的应用。通过分析芯片的核心优势、硬件设计要点和低功耗固件策略,手把手教你实现日均功耗低于5μA的遥控器原型,并附有原理图设计详解和常见问题解决方案。

tgb34567890的博客 619

十一、Java多线程

文章目录十一、Java多线程1.实现多线程1.1进程和线程【理解】1.2实现多线程方式一:继承Thread类【应用】1.3设置和获取线程名称【应用】1.4线程优先级【应用】1.5线程控制【应用】1.6线程的生命周期【理解】1.7实现多线程方式二:实现Runnable接口【应用】2.线程同步2.1卖票【应用】2.2卖票案例的问题【理解】2.3同步代码块解决数据安全问题【应用】2.4同步方法解决数据安全问题【应用】2.5线程安全的类【理解】2.6Lock锁【应用】3.生产者消费者3.1生产者和消费者模式概述【应

汪随安的博客 3017

VisionPro开发实战:CogRecordDisplay控件显示与保存图片的完整流程(附C#代码示例)

本文详细解析了VisionPro开发中CogRecordDisplay控件的图像处理全流程,包括图像加载、显示优化、动态清屏及结果保存等关键操作。通过C#代码示例,展示了如何高效使用该控件进行工业视觉应用开发,特别适合自动化检测系统的开发者参考。

weixin_42523792的博客 274

新出的智谱GLM-4.7很牛逼?

Zhipu AI(智谱)最近发布的 GLM-4.7 再次刷新了开源大模型的天花板。作为一款约 400B 参数规模的 MoE 模型,它不仅在传统的代码与推理任务上超越了 DeepSeek-V3.2 和 Kimi-K2 等强力对手,更通过**“保留思考(Preserved Thinking)”和“交错思考(Interleaved Thinking)”**等架构级创新,重新定义了 Agentic Workflow 的设计范式。

kakaZhui的博客 2392

【Java基础知识8】多线程与并发

介绍多线程之前要介绍线程,而介绍线程则离不开进程1.进程在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。

阿志的博客 1367

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1730

Java多线程基础知识

这是我再次学习多线程知识的一个总结,对于刚刚接触的学习者是比较友好易懂的,便于快速的理解和掌握。

gldzzznb的博客 3544

硬件知识点-----SPI串联电阻、振铃、过冲

电阻取值,没有公式,一被传输线的特征阻抗为50欧姆左右,而TTL电路输出电阻大桃为13欧姆左右,在源端串一个33姆,大致和50相当,这样就可以柳制从终端反射回来的倍号,防止再次反射。传输时间tp=L/V,其中L是导线长度,V是电磁波在电路板中的传输速度V=C/sqrDk,其中Dk是光速衰减因子,对于电路板而言是铜线,Dk=4电磁波在电路板中的速度都是慢于光速的。实际上串联多大的电阻与传输线的阻抗有关,为了保证阻抗的连续性,如果传输线的特性阻抗 Z0与驱动源的输出阻抗 Zd不匹配,会引发信号的反射。

贾saisai的博客 2714

Devexpress16.2.6破解工具

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

java多线程基础知识-电子时钟

java多线程基础知识简单应用-电子时钟 参考文档《java语言程序设计》-13章多线程实现电子时钟 首先是继承Thread类实现多线程:这段程序可以初步了解线程的“同时执行”,运行可以发现每次运行的结果都是不同的。 Threads.javapackage project1_Thread; public class Threads { public static void main(

独恋幽兰的专栏 4445

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java多线程--基础知识

本文介绍Java多线程的基础知识。包括:多线程同步的实现方式,死锁产生的条件,如何避免死锁。 多线程同步的方案 方式 优点 缺点 使用场景 synchronized 使用简单;CPU占用低 响应缓慢(并发性能差);不灵活。 并发量低;大的代码块 同步方法/代码块 并发集合(List,Map) 例:ConcurrentHashMap等 并发性能高 ...

IT利刃出鞘的博客 3845

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java中的多线程基础知识

JavaSE回顾-多线程基础知识整合 多线程 基本概念 程序(program) 进程(process) 线程(thread) Java中的线程 多线程的用处 时间片 并行和并发 同步和异步 临界区 阻塞和非阻塞 问题引入 多线程的实现方式 方式一: 继承Thread类 方式二:实现Runnable接口(常用,优点多) 为什么实例效果不明显? 多线程的两种实现方式的区别 匿名内部类实现线...

胡啊呦的博客 460

【java】多线程基础知识

就绪状态(Runnable):调用对象的start(),使线程从新建状态过渡到就绪状态。运行状态:在就绪队列中排队的线程获取了cpu的使用权,就处于运行状态cpu给线程服务,就是要执行线程的run()。编写一个类,实现一个接口java.lang.Runnable,实现接口中的run()方法,将一个线程完成特定任务。引出:当多个线程同时访问一个资源时如变量,就称这个资源叫做临界资源,临界资源被访问时,会产生一些问题。4.死亡状态:如果run()执行结束,或者在执行的过程出现异常或错误,线程处于死亡状态。

Yihong1833100198的博客 1390

初识多线程:Java多线程初阶基础知识

线程(Thread)是进程中的一个执行单元,是操作系统进行调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源(如内存空间、文件描述符等),但各自拥有独立的程序计数器、栈空间和局部变量。本文介绍了Java多线程的基础知识,包括线程与进程的区别、线程的五种创建方式、Thread类的构造方法与属性、线程的启动与中断、等待线程、获取当前线程及线程休眠等内容。多线程是Java编程中的重要知识点,掌握基础后还需深入学习线程同步(如Lock)、线程池、并发容器等进阶内容。

nice_lcj520的博客 643

JAVA面试八股文之多线程基础知识

本文介绍了Java多线程编程的基础知识,主要内容包括:线程与进程的区别、并行与并发的概念、线程创建的4种方式(继承Thread类、实现Runnable/Callable接口、线程池)、线程状态及其转换(新建、可运行、阻塞、等待等)、线程调度方法(join/notify/notifyAll)、wait与sleep的区别、线程停止的3种方式(标志位/stop/interrupt)等核心知识点。通过代码示例详细讲解了多线程的基本原理和使用方法,适合准备Java面试的开发者复习线程相关考点。

2401_89221867的博客 1199

万字梳理java多线程的基础知识

关于java的线程的这些基本知识你真的掌握了吗 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录关于java的线程的这些基本知识你真的掌握了吗前言一、线程是什么?二、多线程的引入1.为什么引入多线程2. 何时需要多线程多线程的四种创建方式方式一:继承Thread类方式二:实现Runnable接口前面两种创建多线程方式的对比Thread类中的常用方法创建线程的第三种方法:**实现Callable接口**创建线程的第四种方法:**使用线程池**总结 前言 作者本身是一个以Java为

weixin_48184196的博客 194
上一篇: Java基础知识(十)--多线程
下一篇: Java基础知识(十二)--多线程通信
新时代Java农民工
博客等级 码龄7年 16粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值