Java面试必问多线程简答题

2023-02-24 15:09:13 浏览数 (1)

1

什么是线程?什么是多线程?

1)什么是线程: 在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前这个进程划分成多个运行区域,每个独立的小区域(小单元)称为一个线程。 例如:360杀毒软件,同时既可以安全体检电脑又可以清理电脑中的垃圾。那么这里的安全体检是360杀毒软件中的一个线程,清理电脑中的垃圾也是一个线程。 2)什么是多线程: 一个进程如果只有一条执行任务,则称为单线程程序。 一个进程如果有多条执行任务,也就是说在一个进程中,同时开启多个线程,让多个线程同时去完成某些任务(功能)。则称为多线程程序。

2

实现多线程的方式?用哪个更好?

1.方式一:继承Thread,重写Thread类中的run方法; 2.方式二:实现Runnable接口,实现run方法; 3.方式二的方式更好,原因是:     ①避免了Java单继承的局限性;     ②把线程代码和任务的代码分离,解耦合(解除线程代码和任务的代码模块之间的依赖关系)。代码的扩展性非常好;     ③方式二可以更方便、灵活的实现数据的共享

3

什么是线程安全问题

多线程环境中,且存在数据共享,一个线程访问的共享数据被其它线程修改了,那么就发生了线程安全问题;整个访问过程中,无一共享的数据被其他线程修改,就是线程安全的

4

如何解决线程安全问题

1.使用线程同步机制,使得在同一时间只能由一个线程修改共享数据; 2.消除共享数据:即多个线程数据不共享或者共享的数据不做修改,将全局数据转换为局部数据;   如在SpringMVC中,就采用的该种方式解决线程安全问题。在Controller中,service为多个线程共享的数据,但是service为单例的,且不会被修改;controller中的方法,接收请求数据方式为局部变量,多个线程不共享数据。即不会产生线程安全问题

5

什么是线程同步?

当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态

6

启动一个线程是用run()还是start()? .

启动线程肯定要用start()方法。当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法(如果有的话)。start()是方法,它调用run()方法.而run()方法是你必须重写的. run()方法中包含的是线程的主体

7

什么是死锁?死锁产生的原因有哪些?

1.什么是死锁 死锁是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待的现象 2.死锁产生的原因 ①系统资源的竞争 通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在 运行过程中,会因争夺资源而陷入僵局,如磁带机、打印机等。只有对不可剥夺资源的竞争 才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的。 ②进程推进顺序非法 进程在运行过程中,请求和释放资源的顺序不当,也同样会导致死锁。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都 会因为所需资源被占用而阻塞

8

死锁产生的必要条件?

死锁产生的条件 产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。 ①互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。 ②请求与保持条件(Hold and wait):进程已获得了一些资源,但因请求其它资源被阻塞时,对已获得的资源保持不放。 ③不可抢占条件(No pre-emption) :有些系统资源是不可抢占的,当某个进程已获得这种资源后,系统不能强行收回,只能由进程使用完时自己释放。 ④循环等待条件(Circular wait):若干个进程形成环形链,每个都占用对方申请的下一个资源。

9

如何解决死锁问题?

3.死锁解决几种方式: ①加锁顺序(线程按照一定的顺序加锁,只有获得了从顺序上排在前面的锁之后,才能获取后面的锁) ②加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁) ③死锁检测 (判断系统是否处于死锁状态) ④死锁避免(指进程在每次申请资源时判断这些操作是否安全。例如银行家算法:在分配资源之前先看清楚,资源分配后是否会导致系统死锁。如果会死锁,则不分配,否则就分配。)

10

线程的两个方法sleep()和wait()的区别

1.sleep()方法,属于Thread类的;wait()方法,则是属于Object类的; 2.sleep方法不会释放锁,而wait方法会释放锁 3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 4.sleep需要接收时间参数,wait不需要接收时间参数; 5.sleep可以自然醒,wait必须等待别人唤醒;

11

notify和notifyAll

如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁,需要等待唤醒。当有线程调用了对象的 notifyAll()方法(唤醒所有 wait 线程)或 notify()方法(只随机唤醒一个 wait 线程),被唤醒的的线程便会进入该对象的锁池中,锁池中的线程会去竞争该对象锁。

12

什么是锁机制?及其优缺点

有些业务逻辑在执行过程中要求对数据进行排他性的访问,于是需要通过一些机制保证在此过程中数据被锁住不会被外界修改,这就是所谓的锁机制。 优点:保证资源同步 缺点:有等待肯定会慢

13

乐观锁和悲观锁

悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于多读的应用类型,这样可以提高吞吐量。可以使用版本号机制和CAS算法实现(自己了解)

14

TCP和UDP的区别

1、TCP(面向连接如打电话要先拨号建立连接),建立TCP连接需经过三次握手,释放TCP连接需经过四次挥手;UDP是无连接的,即发送数据之前不需要建立连接 2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付 Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。 3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。 4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信 5、TCP对系统资源要求较多,UDP对系统资源要求较少。

0 人点赞