JAVA笔记:多线程基础知识

进程与线程

进程:

进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

线程:

线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

进程和线程的关系:

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.

并行与并发

并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。

上下文切换

上下文切换,有时也称做进程切换或任务切换,是指CPU 从一个进程或线程切换到另一个进程或线程。

多线程

如名称所示,多个线程多条路径同时进行

使用多线程的原因

为了避免阻塞,单线程阻塞后会导致整个进程被阻塞,而使用多线程可以解决这个问题,提高效率。

使用多线程可能导致的问题

1、线程过多:如果系统上的线程数量远远超过核心的数量,那么就会导致频繁的上下文切换,进而降低性能,如缓存污染。通常支持超线程的多核处理器能够使用的线程数最多是物理核心数的2倍,再增加就有可能降低程序的性能;
2、数据竞争:当多个线程读写同一共享数据时,便会产生竞争,需要同步,同步通常会导致线程之间的相互等待,潜在的降低了性能;另一方面,如果不使用同步程序可能无法并行。
3、死锁:线程发生死锁时,处理器都在操作(一直询问需要的资源是否可用),但是线程都在相互等待其他线程释放资源,处于僵持状态。
4、饿死:当一个或多个线程永远没有机会调度到处理器上执行,而陷入永远的等待的状态。
5、伪共享:当多个线程读写的数据映射到同一条缓存线上时,如果一个线程更改了数据,那么其他线程对该数据的缓存就要被失效,,如果频繁地更改数据,硬件就需要不停的更新缓存线,这使性能从独享缓存的水平降低到共享缓存或内存的水平。

线程死锁:
发生原因:

两个或多个线程互相持有对方的锁

如何避免:

不要在同个代码块中,持有多个对象的锁

线程生命周期以及状态:
线程生命周期


JAVA多线程

Java中线程创建的三种方式

  1. 继承Thread类
  2. 实现Runable接口
  3. 实现Callable接口(JUC包下,java.util.concurrent)

sleep()与wait()的区别

首先sleep方法属于Thread类,而wait方法属于Object类;
调用sleep()方法不会释放对象锁,当等待时间了,又会进入就绪状态等待cpu调用;
Object类;
调用sleep()方法不会释放对象锁,当等待时间了,又会进入就绪状态等待cpu调用;
而wait()方法会丢失对象锁,当被notify()唤醒后,又会进入同步阻塞状态,等待获取对象锁,之后再进入就绪状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值