【Java 线程系列】Java线程之间的共享和协作,linux面试常问试题及答案

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

2、多线程


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

3、核心数、线程数


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

在这里插入图片描述

三、CPU 时间片轮转机制

===========================================================================

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

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

四、并行和并发

=====================================================================

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

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

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

1、并发


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

2、并行


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

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

在这里插入图片描述

五、高并发编程

=====================================================================

  • 由于多核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. 难以确保及时性。

  2. 难以降低开销。如果降低睡眠的时间,比如休眠 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)

  • 对于超时时间更细粒度的控制,可以达到纳秒

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

  1. 获取对象的锁。

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

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

在这里插入图片描述

通知方遵循如下原则。

  1. 获得对象的锁。

  2. 改变条件。

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

在这里插入图片描述

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

notify 和 notifyAll 应该用谁

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

3)]

[外链图片转存中…(img-0XPdq4Ig-1713660469134)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-g1V6U8Md-1713660469134)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值