JAVA多线程知识总结

线程与进程
进程:一个程序在内存中运行,就对应一个进程
线程:程序执行的基本单元,一个进程可以对应一个或多个线程

并发与并行
并行:同一时刻执行多个事件,并发是多个实体的同一事件
并发:同一时间间隔执行多个事件,并发是同一实体的多个事件
并行是针对进程,并发是针对线程的

多线程的优势
线程在程序中是独立、并发的执行流,与分隔的进程相比,进程中线程之间的隔离程度要小。由于多个线程共享内存,因此可以极大的提高程序的运行效率。

线程的生命周期
线程的生命周期包括:新建、就绪、运行、阻塞、销毁。
新建:new关键字创建了一个线程之后,线程就处于新建状态
就绪:线程对象执行了start()方法后,线程就处于就绪状态,等待cpu分配资源
运行:线程获得cpu的资源,开始运行
阻塞:在某种情况下,线程会进入阻塞状态,比如调用了sleep方法,调用阻塞I/O,线程在等待某个通知
销毁:线程运行结束之后,需要销毁线程

创建线程的方法
1、继承Thread类
2、实现Runnable接口
3、实现Callable接口

一般推荐使用实现Runnable接口和Callable接口的方式来创建多线程,原因是:
1、避免java中单继承的限制
2、降低了线程对象和线程任务的耦合性

run和start的区别
start()是线程的启动者, 这时此线程是处于就绪状态,等待CPU的调度。
run()是线程任务的运行者。

线程安全问题
从某个线程开始访问到访问结束的整个过程,如果有一个访问对象被其他线程修改,那么对于当前线程而言就发生了线程安全问题;如果在整个访问过程中,无一对象被其他线程修改,就是线程安全的。

线程安全的解决方法:
1、同步代码块
使用synchronized关键字修饰代码块
2、同步方法
使用synchronized关键字修饰方法
3、同步锁
使用Lock锁方式解决线程安全问题

synchronized 和 Lock 有什么区别
1、synchronied关键字修饰的代码块或方法在运行结束后,会自动释放锁;而Lock锁方式需手动为代码块加锁并释放锁
2、Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。

死锁
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

产生死锁的四个条件
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不可抢占条件:进程已获得的资源,在末使用完之前,不能强行剥夺,只能在进程使用完时由自己释放。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

sleep和wait的区别
sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行。

sleep在等待时间后会自动唤醒,wait需要用notify或者notifyall去唤醒

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值