线程及死锁问题

一:进程与线程的区别:

进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源配置和调度的一个独立单位
线程:进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是他可与同属一个进程的其他线程共享进程所拥有的全部资源。

二:如何实现多线程:

java多线程可以提高程序的并行,提高效率,通过继承Thread类,实现Runnable接口,实现Callable来实现,通常建议使用Runnable接口来实现多线程,因为它还可以继承别的类,拓展比较好。继承Runnable重写run方法,调用线程的start启动线程就行。

三:多线程的五种状态:

  1. 新建状态:new 对象之后,进入新建状态
  2. 就绪状态:调用start方法之后进入就绪状态,等待CPU执行时间
  3. 运行状态:其中一个线程,抢占到CPU的执行时间,进入运行状态
  4. 阻塞状态:调用sleep,wait方法,进入阻塞状态,阻塞完之后,进入就绪状态,等待抢占CPU
  5. 死亡状态:线程执行完毕或出现异常等情况,线程结束

四:sleep wait 区别:

Sleep()是线程类(Thread)的静态方法,此方法会让当前线程暂停执行指定的时间,将CPU让给其他线程,但是对象的锁依然保持,所以睡眠时间结束后会自动回到就绪状态。
wait()是object类的方法,调用此方法导致当前线程放弃对象的锁,进入对象的等待池(wait pool),只有调用对象的notify(或者notifyAll()方法)才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

五:线程的run()和start()有什么方法

run():调用一个普通的方法,并没有启动另一个线程,程序还是会按照顺序执行相应的代码
start():重新开启一个线程,不必等待其他线程运行完,只要得到CPU就可以运行该线程

六:线程池的种类:

  1. newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
  4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

七:线程池如何使用:

线程池可以限制线程最大的并发数量,保证程序的稳定运行,因为多线程虽然可以提高效率,但是也占用了CPU的资源,如果线程开的过多,会导致CPU消耗严重,所以在使用多线程的时候,要控制线程的最大并发。为了保证最大的并发,一般使用定长线程池,首先创建一个线程池:newFixedThreadPool a = new newFixedThreadPool(5)将上线设置为5,然后有线程池去运行线程,这个时候,线程的最大并发会保持在5,执行完线程才会开始下一个线程。

八:同步锁 synchronized lock

  1. Synchronized和lock都是同步锁,可保证多线程并发下,数据安全的问题。
    线程不安全指的是当多并发的情况下对同一个数据进行操作,导致冲突问题。
    解决:控制当线程并发的时候如果调用数据的时候,只能同步,不能并发,在方法上加上synchronized就可完成控制,synchronized的意思是当这个方法被调用后,其他线程就不能调用这个方法,必须等待这个线程执行完,才可调动这个方法,保证了数据不会冲突,这就是同步锁代码的底层。
  2. lock也是锁的意思,但是与synchronized不同,lock是一个接口,synchronized是一个内置关键字。synchronized发生异常会自动释放锁,不会产生死锁,lock则需要手动调用unlock()方法释放,容易造成死锁,所以lock一般是在try catch使用,在finally释放锁。而且lock是在数据冲突的时候在进行同步,如果两次线程没有冲突是可以并行的,synchronized必须同步,因此lock效率比synchronized高些。

九:并行和并发的区别:

普通解释:
  并发:交替做不同事情的能力
  并行:同时做不同事情的能力
理解:
  (1)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
  (2)并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
  (3)在一台处理器上“同时”(这个同时实际上市交替“”)处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群

十:什么是死锁:

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

十一:如何避免死锁:

当发生死锁后我们如果能找到是哪句sql导致的死锁,将其提交了就可以,如果找不到是哪一句sql,可以将程序关闭并重启就可以了。至于如何避免死锁:
多表操作时尽量按照相同的顺序执行,尽量避免同时锁定两个资源,多个sql修改同一个数据容易造成死锁,尽量避免并发修改同一个记录,以及尽量避免索引使用不当导致全表扫描,以上这些都可能导致死锁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值