多线程浅析

进程:进程的定义时抽象的,我的理解是一个程序在一个数据集上的一次执行过程,是操作系统进行资源调度分配的最小单位
组成:数据集,程序,进程控制块。
线程:资源独立运行的最小单位。任务调度采用时间片轮转的抢占式方式,每个线程都有各自独立的一块内存空间,一个进程对应有一个或者多个线程,各线程之间共享程序的内存空间。

1.使用多线程的好处:
1.可以充分利用系统资源,充分利用CPU的空闲时间
2.同一进程的所有线程是共享统一内存。不需要特殊的数据传输机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行,数据的交互,资源的分配等问题都更易于解决。

2.使用Runnable接口比继承Thread类所具有的优势:
1.适合多个相同的程序代码的线程去共享同一个资源(runable接口的属性可以被多个线程共享)
详见:https://blog.csdn.net/Tszching_Leung/article/details/85175098
2.可以避免JAVA中的单线程的局限性
3.增加程序的健壮性,代码可以被多个线程共享,代码和数据独立‘
4.线程池只能放入实现Runnable或Callable类线程,不能直接放入继承Thread的类
3.用户线程与守护线程
1.用户线程:默认不做任何操作就是用户线程,当主线程停止,用户线程还会执行
2.守护线程: setdomain(true),当主线程停止,用户线程不会执行。所有线程都会结束。
4.线程安全问题:
本质:其实就是破坏了数据的原子性。
原因:将读写操作进行了分割,当读写分割后,如果一条线程读完但未写时被CPU停掉,此时其他线程可能程序而入导致最后产生奇怪数据。
解决方法:
1.synchronized同步代码块
2.synchronized同步方法
3.Lock锁
面试题:同步块,意味着同步块之外的代码都是异步执行的,当然是同步的范围越小效率越高,锁粗化:如append方法,要不断的加锁解锁,消耗性能,因此锁粗化将多次调用append方法的操作扩展到append方法的头和尾。,编程一个大的同步块。,这样就减少了加锁解锁的次数,有效的提高了效率。

5.死锁:
1. 死锁现象:1.哲学家用餐问题
2.打印机,输入设备问题
2.死锁产生原因:
1.系统资源的竞争:
进程因争夺不可剥夺资源,产生死锁。
2.进程推进顺序非法:
进程在运行过程中,请求和释放资源不当,p1,p2分别保持了资源R1,R2,进程1申请 资源r2,进程2申请资源r1.从而阻塞。
3.死锁产生的必要条件:产生死锁必须要满足以下四个条件
1.互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
2.不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。
3.请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
4.循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, …, pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有。
4.如何避免死锁:
1.加锁顺序:所有线程都加相同顺序的锁
2.加锁时限:线程尝试获取锁时加上一定的时限。
3.加锁检测

join方法:让其他线程变为等待状态,把指定的线程加入到当前的线程中,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的join方法,当线程A执行完以后才会执行线程B的方法。
yield:暂停当前正在执行的线程,并执行其他线程。(可能没有效果)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值