javase-----(12)多线程的注意事项

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

目录

多线程的注意事项

【一】进程和线程的区别

【二】线程的几种状态转换

【三】阻塞的情况

 对阻塞的解释:

注意

【四】线程的死锁

介绍

死锁的原因:

避免死锁的原因:


多线程的注意事项

【一】进程和线程的区别

1、进程是资源分配最小单位,线程是程序执行的最小单位;

2、进程有自己独立的地址空间,每启动一个进程,系统都会为其分配地址空间,建立数据表来维护代码段、堆栈段和数据段,线程没有独立的地址空间,它使用相同的地址空间共享数据;

3、CPU切换一个线程比切换进程花费小;

4、创建一个线程比进程开销小;

5、线程占用的资源要⽐进程少很多。

6、线程之间通信更方便,同一个进程下,线程共享全局变量,静态变量等数据,进程之间的通信需要以通信的方式(IPC)进行;(但多线程程序处理好同步与互斥是个难点)

7、多进程程序更安全,生命力更强,一个进程死掉不会对另一个进程造成影响(源于有独立的地址空间),多线程程序更不易维护,一个线程死掉,整个进程就死掉了(因为共享地址空间);

8、进程对资源保护要求高,开销大,效率相对较低,线程资源保护要求不高,但开销小,效率高,可频繁切换

 

【二】线程的几种状态转换

 

 

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

【三】阻塞的情况

1、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,

2、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

3、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

 

 对阻塞的解释:

1、当线程调用了自身的sleep()方法或其他线程的join()方法,进程让出CPU,然后就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源即调用sleep ()函数后,线程不会释放它的“锁标志”。)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配CPU时间片

2、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到就绪状态

3、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入就绪状态,等待OS分配CPU时间片

4、wait()和 notify() 方法:当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同,进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记

5、suspend() 和 resume()方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()被调用,才能使得线程重新进入可执行状态

 

注意

1、初看起来wait() 和 notify() 方法与suspend()和 resume() 方法对没有什么分别,但是事实上它们是截然不同的。区别的核心在于,前面叙述的suspend()及其它所有方法在线程阻塞时都不会释放占用的锁(如果占用了的话),而wait() 和 notify() 这一对方法则相反。

2、第一:调用notify() 方法导致解除阻塞的线程是从因调用该对象的 wait()方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。

3、第二:除了notify(),还有一个方法 notifyAll()也可起到类似作用,唯一的区别在于,调用 notifyAll()方法将把因调用该对象的 wait()方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态

 

【四】线程的死锁

介绍

死锁问题是多线程特有的问题,它可以被认为是线程间切换消耗系统性能的一种极端情况。在死锁时,线程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,其结果是系统任务永远无法执行完成。死锁问题是在多线程开发中应该坚决避免和杜绝的问题。

 

死锁的原因:

1、互斥条件:一个资源每次只能被一个线程使用。

2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

3、不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。

4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

 

避免死锁的原因:

1、设计时考虑清楚锁的顺序,尽量减少嵌在的加锁交互数量

2、让程序每次至多只能获得一个锁。当然,在多线程环境下,这种情况通常并不现实

3、既然死锁的产生是两个线程无限等待对方持有的锁,那么只要等待时间有个上限不就好了。当然synchronized不具备这个功能,但是我们可以使用Lock类中的tryLock方法去尝试获取锁,这个方法可以指定一个超时时限,在等待超过该时限之后变回返回一个失败信息

 

Java多线程注意事项(初级程序员必看) java多线程,初级程序员必看 阅读详情

相关推荐

12多线程、锁机制、lock锁】

一、多线程概念 我们之前在进行程序设计时,程序都是由上往下依次执行,无法让多个应用程序同时执行。不管是我们电脑上还是手机中的应用程序,我们都可以让多个应用程序同时执行。例如一边运行QQ,一边运行酷狗音乐。打开QQ时一边聊天,又一边上传群文件,还一边下载群文件,同时与多个人聊天等。要使得我们的程序能够同时运行多个应用程序就需要使用到多线程/多进程的知识了; 1.1 程序的并发与并行 1.1.1 程序的并行 程序的并行指的是多个应用程序真正意义上的同时执行,CPU分配多个执行单元共同执行这些任务,效率高,但这依

緑水長流*z 5068

JAVA多线程的使用场景与注意事项总结

主要给大家介绍了关于JAVA多线程的使用场景与注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

15个多线程问题集锦

此文,描述了多线程的几个最核心的使用问题以及注意事项

线程假唤醒现象

pthread_cond_wait的spurious wakeup问题

浮白 4838

多线程(java)

一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行 着多份代码.举个生活中的例子:想象一下你去一家咖啡店点咖啡的情景。在这个例子中,我们可以将这家咖啡店看作是一个程序,而店内的工作人员则可以视为线程。假设这家咖啡店提供两种服务:一种是现场制作咖啡,另一种是准备外卖订单。为了提高效率,咖啡店安排了两个工作人员分别负责这两项工作。:一位工作人员专门负责为现场顾客制作咖啡。当顾客下单后,这位工作人员就开始准备咖啡,并且在完成后交给顾客。

m0_63272315的博客 2227

Java多线程编程的注意事项是什么?

4.Java内存模型保证了共享变量在多线程之间的可见性,但是为了确保线程之间对共享变量的修改能够及时被其他线程看到,需要使用volatile关键字或者显式的同步来保证数据的可见性。因此,要编写充分的单元测试来验证多线程代码的正确性,使用调试工具来分析并发问题的根本原因。尽量减少共享状态,优先选择线程安全的数据结构和不可变对象,或者使用适当的同步机制来保护共享状态。16.多线程编程往往涉及到性能优化。需要谨慎评估各种并发方案的性能特征,避免过度同步或线程间频繁的切换和竞争,以及避免线程阻塞时的资源浪费。

775

java多线程 注意事项_多线程使用及注意事项

1、并行和并发的区别2、多线程(高并发编程)的优点3、多线程程序需要注意事项4、线程的启动与安全中止5、怎么安全中止线程(interrupt())并行和并发的区别:一个是同时执行,一个是交替执行(线程切换)。例:把线程比做高速公路,如果有条高速公路并排有8条车道,那么最大的并行车辆就是8辆,只要车辆<=8,车辆就可以并行运行。单位时间内通过的车辆,就是并发。多线程(高并发编程)的优点:(1)...

weixin_30965253的博客 2934

javase-----12多线程注意事项2

目录 多线程注意事项 【一】同步 1.1 为何要使用同步? 【二】java线程池的使用 线程池的实现原理: (2)newFixedThreadPool (3)newSingleThreadExecutor (4)newScheduleThreadPool 多线程注意事项 【一】同步 1.1 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享...

wenge1477的博客 281

JavaSE】【多线程】volatile,wait/notify

volatile处理内存可见性问题 wait / notify调控线程调度

yj20040627的博客 3494

JavaSE面试题总结

JavaSE面试题总结     目  录 第一章  初识Java 1 1. Java跨平台原理(字节码文件、虚拟机) 1 2. Java的安全性 1 3. Java三大版本 2 4. Java开发运行过程 2 5. Java开发环境配置 2 6. 什么是JVM?什么是JDK? 什么是JRE? 2 7. Java三种注释类型 3 第二章 数据类

elephant_over的博客 1911

JavaSE集合

weixin_71001270的博客 1343

JavaSE--线程

见:JavaSE-线程介绍、生命周期、线程同步总结.xmind。

qq_59737375的博客 822

JavaSE

JavaSE什么是JDK,JREJDK(Java Development Kit Java开发工具包)JRE(Java Runtime Environment Java运行环境)jvm,jdk,jre关系图 什么是JDK,JRE JDK(Java Development Kit Java开发工具包) JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了 JRE。所以安装了JDK,就不用在单独安装JRE了。 其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)

weixin_44253705的博客 3822

javaSE面试题---语法基础、面向对象、常用类、集合、多线程、文件和IO

不定参数方法指的是方法的参数是动态的,不固定的。不定参数的形参本质上是数组。在方法调用时,实参会依次拷贝到形参数组中通过数组下标可以获取传入的参数。注意事项:一个方法最多只能有一个不定参数,在方法定义时,不定参数应该作为方法的最后一个参数。在方法定义时,参数列表中的参数称为形参,也叫形式参数。在方法调用时,传入方法中的参数称为实参,也叫实际参数。在方法调用时实参会拷贝给形参,实参到形参是单向的值拷贝过程。类是对具有相同特征和行为的事物的抽象。对象是类的实例,是类的具体体现。

yang_xiao_wu_的博客 1264

JavaSE-详细介绍

Java SE是Java技术的核心和基础

qq_68874993的博客 4485

重拾JavaSE学习笔记

重拾JavaSE学习笔记常用DOS命令了解java 常用DOS命令 1、打开DOS命令窗口 win键+r 打开运行窗口 输入cmd 2、创建文件夹 make directory mkdir 文件夹名 地址为当前执行地址 3、DOS命令窗口复制内容 win7 :右键-》标记-》选中要复制的内容-》点击右键-》复制到剪贴板 win10:左键选中-》右键单击-》复制到剪贴板 4、切换盘符 直接输入盘符 c: -》回车 e: -》回车 5、切换目录 有盘符的是绝对路径 cd (change directory

qw6565665的博客 696

JavaSE——第17章 多线程基础

JavaSE——第17章 多线程基础

代码改变世界 529

多线程同步)day12javaSE基础查漏补缺

多线程同步1.debug调试(阻塞所有线程)2.class对象会被回收嘛3.静态的同步方法的锁对象4.乐观锁和悲观锁并没有优劣之分,它们有各自适合的场景。5.多线程共享资源,Thread或者Runnable继承实现中一定要写static关键字6.快捷键:复制一行Ctrl + alt + 下方向7.获取线程名称:Thread.currentThread().getName()8.试着在程序中写匿名内部类和内部类。9.根据你的理解,请说出CountDownLatch类的作用10.根据你的理解,请说出Cyclic

休哥哥的博客 347

视频教程-JavaSE基础全套视频(环境搭建 面向对象 正则表达式 IO流 多线程 网络编程 java10-Java

JavaSE基础全套视频(环境搭建 面向对象 正则表达式 IO流 多线程 网络编程 java10 ...

weixin_33869078的博客 309
上一篇: javase-----(11)集合家族的底层数据结构及源码
下一篇: javase-----(12)多线程的注意事项2
wenge1477
博客等级 码龄8年 72粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值