当前位置:

首页 > 编程开发 > Java线程共享和协作的实现方式

Java线程共享和协作的实现方式

一、进程和线程1、进程是程序运行资源分配的最小单位进程是操作系统进行资源分配的最小单位,其中包括:CPU、内存空间、磁盘IO等、同一进程中的多条线程共享该进程中的全部系统资源,而进程和进程直接是相互独立的。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然程序是死的、静态的、进程是活动的、动态的。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进

    一、进程和线程

    1、进程是程序运行资源分配的最小单位

    进程是操作系统进行资源分配的最小单位,其中包括:CPU、内存空间、磁盘IO 等、同一进程中的多条线程共享该进程中的全部系统资源,而进程和进程直接是相互独立的。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

    进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然程序是死的、静态的、进程是活动的、动态的。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们是处于运行状态下的操作系统本身,用户进程就是所有由你启动的进程。

    2、线程是CPU 调度的最小单位,必须依赖于进程而存在

    线程是进程的一个实体,是CPU调度和分派的基本单位,它是比经常更小的、能够独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和堆栈),但是它可以与同一个进程的其他线程共享进程所拥有的全部资源。

    3、线程无处不在

    任何一个程序都必须创建线程,特别是Java不管任何程序都必须启动一个main函数的主线程;Java web开发的定时任务、定时器、JSPServlet、异步消息处理机制,远程访问接口 RM 等,任何一个监听事件,onClick的触发事件等都离不开线程和并发的知识。

    二、CPU 核心数和线程数的关系

    1、多核心

    多核心:也指单芯片多处理器(Chip Multiprocessors,简称 CMP),CMP是由美国斯坦福大学提出的,其思想是将大规模并行处理器中的SMP(对称处理器)集成到同一芯片内,各个处理器并行执行不同的进程。这种依靠多个CPU同时并行的运行程序是实现超高速计算的一个重要方向,称为并行处理。

    2、多线程

    多线程Simultaneous Multithreading.简称 SMT.让同一个处理器上的多个线程同步执行并共享处理器的执行资源。

    3、核心数、线程数

    核心数、线程数:目前主流CPU都是多核的。增加核心数目的就是为了增加线程数,因为操作系统是通过线程来执行任务的,一般情况下它们是1:1对应关系,也就是说四核 CPU一般拥有四个线程。但Intel引入超线程技术后,使核心数与线程数形成了1:2的关系。

    Java线程共享和协作的实现方式

    三、CPU 时间片轮转机制

    我们平时在开发的时候,感觉并没有受CPU 核心数的限制,想启动线程就启动线程,哪怕是在单核CPU 上,为什么?这是因为操作系统提供了一种CPU 时间片轮转机制。

    时间片轮转调度是一种最古老、最简单、最公平且使用最广的一种算法,又称RR 调度。每个进程被分配一个时间段,称作它的时间片,即该进程运行运行的时间。

    四、并行和并发

    我们举个例子,如果有条高速公路A,上面有4条车道,那么最大并行车辆就是4辆,这条高速公路同时并排行走的车辆小与等于4的时候,车辆就可以并行行驶。CPU也是这个原理,一个CPU相当于一条高速公路,核心数或线程数就相当于并排可以通行的车辆;而多个CPU就相当于有多条高速公路,而每个高速公路并排有多个车道。

    当谈论并发的时候,一定要加个单位时间,也就是说单位时间内并发量是多少?离开单位时间其实是没有意义的。

    俗话说一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,以便运行这个进程。我们通常用的计算机只有一个CPU,也就是说只有一颗心,要让它一心多用同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”。

    1、并发

    并发:指应用能够交替执行不同的任务,比如单CPU核心下执行多线程并非是同时执行多个任何,如果你开两个线程执行,就是在你几乎不可察觉的速度不断去切换执行这两个任务,以达到“同时执行”效果,只是计算机的执行速度太快,我们无法察觉到而已。

    2、并行

    并行:指应用能够同时执行不同的任务,例:吃饭的时候可以边吃饭边看电视,这两件事可以同时执行。

    **并发和并行两者的区别就是:一个是交替执行,一个是同时执行**

    Java线程共享和协作的实现方式

    五、高并发编程

    由于多核CPU的诞生,多线程、高并发的编程越来越受重视和关注。

    1、CPU 资源利用的充分

    从上面CPU的介绍,可以看出现在市面上没有CPU的内核不使用多线程并发机制的,特别是服务器还不止一个CPU。程序的基本调度单元是线程,一个线程也只能在一个一个CPU 的一个核的一个线程跑,如果你是个i3的CPU的话,最差也是双核心4线程的运算能力:如果是一个线程的话,那就会浪费钓3/4的CPU性能:如果设计一个多线程的话,那它就可以同时在多个CPU 的多个核的多个线程上跑,可以充分的利用CPU,减少CPU的空闲时间,发挥它的运算能力,提高并发量。

    2、加快用户响应时间

    比如我们经常使用的下载功能,很多朋友都会开通某一个会员,因为会员版本启用了多个线程去下载,谁都无法忍受一个线程去下,为什么呢?因为多线程下载快啊。

    我们做程序开发的时候,网页速度提升1s,如果用户量大的话,就能增加不少转换量。我们经常浏览的网页中,浏览器在加载页面的时候,都会去多开几个线程去加载网络资源,提升网站的相应速度。多线程和高并发,在计算机中,无处不在。

    3、使代码模块化、异步化、简单化

    例如我们做一个电商项目,下订单和给用户发送短信、邮件就可以进行拆分,将给用户发送短信、邮件这两个步骤独立成两个单独的模块,交给其他线程去执行。这样即增加了异步的操作,提示了系统性能,又使程序模块化,清晰化和简单化。

    六、多线程注意事项

    1、线程之间的安全性

    在同一个进程里面的多线程是资源共享的,也就是都可以访问同一个内存地址当中的一个变量。

    例如:若每个线程中对全局变量、静态变量只读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

    2、线程之间的死锁

    为了解决线程之间的安全性引入了Java 锁的机制,而一不小心就会产生Java 线程死锁的多线程问题,因为不同的线程都在等待哪些根本不可能被释放的锁,从而导致所有的工作都无法完成。

    假设有两个饥饿的人,他们必须共享刀叉并轮流吃饭,他们都需要获得两个锁,共享刀和共享叉。假如线程A获得了刀,而线程B获得了叉。线程A就会进入阻塞状态来等待获得叉,而线程B则主帅来等待线程A所拥有的刀。这只是人为设计的例子,单尽管在运行时很难探测到,这类情况却时常发生。

    3、线程多了会将服务资源耗尽形成死机、当机

    线程数太多有可能造成系统创建大量线程,而导致消耗完系统内存以及CPU的“过渡切换”,造成系统的死机,那么我们改如果解决这类问题呢?

    某些系统资源是有限的,如文件描述。多线程程序可能耗尽资源,因为每个线程都可能希望有一个这样的资源。如果线程数相当大,或者某个资源的侯选线 程数远远超过了可用的资源数则最好使用资源池。一个最好的示例是数据库连接池。只要线程需要使用一个数据库连接,它就从池中取出一个,使用以后再将它返回池中。资源池也称为资源库。

    多线程应用开发的注意事项很多,希望大家在日后的工作中可以慢慢体会它 的危险所在。

    七、多线程注意事项

    线程之间相互配合,完成某项工作,比如:一个线程修改了一个对象的值, 而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程, 而最终执行又是另一个线程。前者是生产者,后者就是消费者,这种模式隔离了 “做什么”(what)和“怎么做”(How),简单的办法是让消费者线程不断地 循环检查变量是否符合预期在 while 循环中设置不满足的条件,如果条件满足则 退出 while 循环,从而完成消费者的工作。

    却存在如下问题:

    • 难以确保及时性。

    • 难以降低开销。如果降低睡眠的时间,比如休眠 1 毫秒,这样消费者能 更加迅速地发现条件变化,但是却可能消耗更多的处理器资源,造成了无端的浪费。

    等待/通知机制:是指一个线程 A 调用了对象 O 的 wait()方法进入等待状态,而另一个线程 B 调用了对象 O 的 notify()或者 notifyAll()方法,线程 A 收到通知后从对象 O 的 wait() 方法返回,进而执行后续操作。上述两个线程通过对象 O 来完成交互,而对象 上的 wait()和 notify/notifyAll()的关系就如同开关信号一样,用来完成等待方和通 知方之间的交互工作。

    notify():通知一个在对象上等待的线程,使其从 wait 方法返回,而返回的前提是该线程获取到了对象的锁,没有获得锁的线程重新进入 WAITING 状态。

    notifyAll():通知所有等待在该对象上的线程

    wait():调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断 才会返回.需要注意,调用 wait()方法后,会释放对象的锁。

    wait(long):超时等待一段时间,这里的参数时间是毫秒,也就是等待长达n 毫秒,如果没有 通知就超时返回。

    wait (long,int):对于超时时间更细粒度的控制,可以达到纳秒

    等待和通知的标准范式 等待方遵循如下原则。

    • 获取对象的锁。

    • 如果条件不满足,那么调用对象的 wait()方法,被通知后仍要检查条件。

    • 条件满足则执行对应的逻辑。

    Java线程共享和协作的实现方式

    通知方遵循如下原则:

    • 获得对象的锁。

    • 改变条件。

    • 通知所有等待在对象上的线程。

    Java线程共享和协作的实现方式

    在调用 wait()、notify()系列方法之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用 wait()方法、notify()系列方法,进 入 wait()方法后,当前线程释放锁,在从 wait()返回前,线程与其他线程竞 争重新获得锁,执行 notify()系列方法的线程退出调用了 notifyAll 的 synchronized 代码块的时候后,他们就会去竞争。如果其中一个线程获得了该对象锁,它就会 继续往下执行,在它退出 synchronized 代码块,释放锁后,其他的已经被唤醒的 线程将会继续竞争获取该锁,一直进行下去,直到所有被唤醒的线程都执行完毕。

    notify 和 notifyAll 应该用谁

    尽可能用 notifyAll(),谨慎使用 notify(),因为 notify()只会唤醒一个线程,我们无法确保被唤醒的这个线程一定就是我们需要唤醒的线程。

    本文内容来源于互联网,如有侵权请联系删除。
    作者最新文章
    编程开发
    相关文章 更多
    C++动态数组初始化怎么写?常用语句与代码示例
    C++动态数组初始化怎么写?常用语句与代码示例

    深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

    谷歌浏览器Mac版入口
    谷歌浏览器Mac版入口

    谷歌浏览器Mac版官方安装指南 谷歌浏览器Mac版官方安装入口是https://www.google.com/chrome/,需macOS 12+系统、500MB空间,下载.dmg后拖入应用程序安装,支持多设备同步、性能优化与隐私保护功能。 苹果电脑Chrome的安装入口究竟在哪里?这个问题最近可是

    Chrome浏览器JS脚本不运行怎么办
    Chrome浏览器JS脚本不运行怎么办

    Chrome中JavaScript未执行需依次检查:一、移除站点级禁用并添加允许域名;二、开启全局JavaScript开关;三、禁用干扰扩展;四、在开发者工具中启用JavaScript;五、重置内容设置为默认。 有时在Chrome里打开网页,会发现交互按钮点了没反应,数据加载不出来,页面仿佛“静止”

    IE浏览器怀旧版在线网址
    IE浏览器怀旧版在线网址

    IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

    火狐浏览器有哪些设置功能
    火狐浏览器有哪些设置功能

    火狐浏览器五大核心设置功能:解锁高效、安全与个性化体验 火狐浏览器功能强大,但如果不仔细挖掘,很多能大幅提升效率和安全性的设置可能就“藏着掖着”了。这就好比拥有一台高性能设备,却只用了基础模式。那么,如何把它调整到最顺手、最安全的状态?接下来,我们就聚焦于当前版本(截至2025年末)最关键的五大设置

    chrome搜索免验证入口
    chrome搜索免验证入口

    Chrome官方免验证入口为https://www.google.cn/chrome/,提供全平台安装包、免登录即用、本地化安全机制及引擎级性能优化。 到底该去哪里找正版、免费且无需繁琐验证的Chrome浏览器入口?这个问题困扰了不少网友。今天,我们就来直通核心,为大家详细拆解Chrome引擎的官方

    java heap space 选型思路:使用场景与区别整理
    java heap space 选型思路:使用场景与区别整理

    Java堆是JVM存储对象的核心内存区域,配置需结合场景:单体应用适中设置;大数据处理需大堆并关注GC停顿;微服务强调快速启动;高并发需精细划分堆区域。关键参数-Xms和-Xmx建议等值以稳定性能。垃圾回收器选择影响效率,如G1适用于大堆,ZGC可实现低停顿。内存错误时需监控堆状态。

    java heap space 使用中遇到的问题怎么解决
    java heap space 使用中遇到的问题怎么解决

    Java堆内存溢出错误通常因内存泄漏、数据处理需求过大或JVM参数配置不当引起。排查时可借助jmap、堆转储及MAT等工具定位问题。解决方案包括调整JVM内存参数(如-Xmx)、修复代码中的内存泄漏、优化大数据处理逻辑,并建立持续监控与预防机制,以保障应用稳定运行。

    java xml 选型思路:使用场景与区别整理
    java xml 选型思路:使用场景与区别整理

    XML在Java开发中用于配置、数据交换等场景。解析方式主要有DOM、SAX、StAX及第三方库。DOM适合操作小文件,SAX/StAX适合处理大文件流,JAXB用于对象与XML映射。选型需结合数据大小、内存、性能及团队熟悉度,现代框架常封装底层解析。

    using namespace 使用中遇到的问题怎么解决
    using namespace 使用中遇到的问题怎么解决

    命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师
    macOS

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    WINDOWS 更多
    Windows 10
    Windows 10
    Windows

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    密码键盘
    密码键盘
    Windows/macOS/iOS/Android

    密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。