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

UE4 GamePlay框架深度解析:从蓝图到C++构建多人游戏核心

在游戏开发与实时交互应用领域,一套清晰、可扩展的底层框架是项目成功的关键。GamePlay框架作为虚幻引擎(UE4/UE5)的核心架构,定义了游戏世界中对象交互、状态管理与网络同步的基本原理。它通过职责分离的设计模式,将游戏规则(GameMode)、全局状态(GameState)、玩家状态(PlayerState)、可操控实体(Pawn/Character)及其控制器(Controller)等核心类有机组织起来,确保了逻辑的清晰性与多人游戏数据的一致性。其技术价值在于为开发者提供了一套经过验证的最佳实践,大

weixin_33924770的博客 611

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

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

lonely_bin的博客 232

从零开始的 AI Infra 学习之路

AI Infra(AI 基础设施)是指为上层的 AI 算法应用提供支持的 AI 全栈底层技术,通过合理利用计算机体系结构,可以实现 AI 计算的加速和部署。AI Infra 主要包括以下内容:AI 训练框架 & 推理引擎;AI 编译 & 计算架构;AI 硬件 & 体系结构。参考资料:;。

AI Infra / LLM / 软件开发 3万+

从零到一:手把手教你用C#开发AGV调度系统(附避坑指南)

本文详细介绍了如何使用C#开发高效的AGV调度系统,涵盖从环境搭建到核心算法实现的完整流程。重点解析了动态路径规划、多机协同等关键技术,并提供了实用的避坑指南和性能优化建议,帮助开发者快速构建工业级车辆控制调度系统。

blockchain9miner的博客 741

Java多线程基础知识总结

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

Pinkgranite86的博客 2721

openlayers6/7 行政区划裁剪 只显示某个区域 示例为天地图

openlayers6/7 行政区划裁剪 只显示某个区域 示例为天地图。

qq_36287830的博客 3100

十一、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

GhidraMCP:AI驱动的逆向工程革命——让LLM自主操作Ghidra进行自动化分析

(Ghidra Machine Control Protocol)应运而生,它通过将LLM与Ghidra(美国NSA开源逆向工具)结合,实现了AI驱动的自动化逆向工程流程。逆向工程是软件安全、漏洞分析和代码审计的核心环节,但传统方法依赖人工分析,耗时且易出错。未来,随着LLM技术的演进和逆向工程工具的优化,GhidraMCP有望成为安全研究人员和开发者的核心工具,推动逆向工程进入“AI辅助时代”。GhidraMCP通过LLM与Ghidra的深度整合,重新定义了逆向工程的自动化边界。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2114

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

基于FPGA的数字信号处理(11)--定点数的舍入模式(2)向最临近值取整nearest

孤独的单刀 5472

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

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

阿志的博客 1367

YOLO26 无损剪枝:稀疏训练 + 结构化通道裁剪

YOLO26 无损剪枝链路:YOLO26s (7.2M) → 稀疏训练 30 epoch (L1 on BN gamma, lam=0.01) → 阈值剪枝 50% (gamma<quantile(0.5)) → 结构化重建 Conv+BN → 微调 10 epoch (lr=1e-4) → YOLO26n (1.9M, mAP50 0.808, 仅降 0.6%)。核心贡献:稀疏训练让 BN gamma 趋向二元分布 (近 0 或近 1), 剪枝阈值可直接取 median 自动 50% 压缩。

m0_64661770的博客 263

Java多线程基础知识

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

gldzzznb的博客 3544

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

独恋幽兰的专栏 4445

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java多线程--基础知识

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

IT利刃出鞘的博客 3845

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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、付费专栏及课程。

余额充值