java的多线程和并发库

1.进程和线程的区别?

进程:具有独立功能的程序关于某次数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位.
线程:是进程的一个实体,是cpu调度和分配的单位,是比进程更小的可以独立运行的单位,

2.线程的几种状态

  • 新建(程序还没运行线程中的代码)
  • 就绪(当start()方法返回后,线程就处于就绪状态,处于就绪状态的线程并不一定立即运行run()方法,而是和其他线程竞争cpu时间)
  • 运行(线程获得cpu时间,进入运行状态,执行run()方法)
  • 阻塞(等待wait、带超时的等待sleep)
  • 终止(死亡,正常退出或者异常终止)
    在这里插入图片描述

3.如何创建一个线程?

4.线程的启动

  • 线程的启动调用start()方法,是线程所代表的虚拟处理机处于可运行状态,这意味着它可以由jvm调度并执行(并不代表会立即执行)
  • run()方法是线程启动后要进行回调(callback)的方法,执行线程

5.线程互斥与同步

互斥(间接相互制约):一个系统中的多个线程必然要共享某种系统资源,如共享 CPU,共享 I/O 设备,所谓间接相
互制约即源于这种资源共享,打印机就是最好的例子,线程 A 在使用打印机时,其它线程都要等待。
同步(直接相互制约):这种制约主要是因为线程之间的合作,如有线程 A 将计算结果提供给线程 B 作进一步处理,那么线程 B 在线程 A 将数据送达之前都将处于阻塞状态。
注意:对于互斥可以这样理解,线程 A 和线程 B 互斥访问某
个资源则它们之间就会产个顺序问题——要么线程 A 等待线程 B 操作完毕,要么线程 B 等待线程操作完毕,这其实就是线程的同步了。因此同步包括互斥,互斥其实是一种特殊的同步。

6.同步和异步的区别?

同步:发送一个请求,等待系统返回后才能发送下一个请求,中间有个等待时间。(当出现多个线程处理共享数据,为了避免一个线程处理的时侯,另一个线程也来处理这个共享数据,造成脏数据的情况,就使用同步的方法,同步就会限制一次只能一个线程来处理,保证共享数据的安全性)
异步:程序不用等待其他请求的返回,随时都可以发送请求。(一般我们写程序时默认使用异步,因为效率高)
区别:同步的效率低,但是安全性高;异步的效率高,但是安全性低。

7.如何实现同步?

  • 同步的关键字synchronized
  • 可以使用同步代码块;synchronized关键字,括号锁对象(不会锁住整个对象)
  • 也可以使用同步方法:在方法权限修饰符后面添加关键synchronized(会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁)

8.sleep和wait的区别

  • 主要区别:
    1.sleep()不会释放锁,其他线程无法进入同步锁,常用于暂停执行.
    2.wait()方法会释放锁,当前线程进入线程池,等待其他线程调用 notify方法唤醒线程,常用于线程交互.
  • 次要区别:
    1.sleep()方法必须设置等待时间。wait方法可以设置也可以不设置。
    2.sleep()时间到线程就处于临时阻塞或者运行,wait没有时间的话,必 须要等到notify或者notifyAll来唤醒。
    3.sleep不一定要定义在同步方法中。wait必须要定义到同步方法中。

9.线程的死锁

死锁:所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
必要条件:互斥条件,不剥夺条件,请求和保持条件,循环等待条件
例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值