Java多线程+并发 快问快答

本文概述了Java中多线程和并发的基本概念,包括线程不安全问题、解决策略(synchronized和volatile)、乐观锁与悲观锁的区别,以及Thread和Runnable的使用。还讨论了线程池的重要性、线程数量管理与核心线程数的相关知识。
摘要由CSDN通过智能技术生成

这是Java多线程和Java并发这两个八股文的快问快答。其实我就会这点,感觉多线程和并发这里并不需要了解的很深入,我也就没有建立起系统观。把这些零零散散的知识点理解好应该就行了。感觉中小厂不会问这么难,中小厂就问一些简单的。

关于线程安全 + 锁的一些概念性问题

1、你是怎么理解线程不安全的?

多个线程同时对一个共享变量进行操作,导致数据出现错误。比如现在有一个共享变量 i=0,然后有10个线程同时对 i 进行++操作,这10个线程同时读。同时修改,同时写回,最后导致i只增加了1次而不是10次。这就是线程不安全。

2、多线程环境下,我们可以怎么解决线程不安全的问题?

可以用 synchronized 关键字修饰方法或代码块,从而锁住方法或代码块,保证线程安全。或者用volatile 关键字修饰共享变量,使得共享变量的修改具有可见性,共享变量相关的指令不能被重排序,保证线程安全。

3、刚才说到了锁,那你觉得锁怎是么实现线程安全?

不会。

4、刚才我们说到了锁,乐观锁和悲观锁了解吗?可以说一说他们的区别吗?

乐观锁是对共享变量进行修改的时候不加锁,等到修改完成准备写回时,如果发现共享变量被改了就回滚。比如 CAS 操作。

悲观锁是在对共享变量进行修改之前就加锁,防止其他线程对这个共享变量进行修改。比如synchronized 关键字。

5、Java 中有些是基于乐观锁实现的,有些是基于悲观锁实现的,你了解到的有哪些呢?

乐观锁比如说 CAS 操作;悲观锁比如说 synchronized 关键字。

关于Java线程的一些杂问题

1、在 Java 中,一个线程的生命周期有哪些?

新建态、就绪态、运行态、阻塞态、终止态

2、在 Java 的中,创建线程的方式有哪些?

通过继承 Thread 类或者实现 Runnable 接口,重写里面的 run() 方法来创建线程

3、你觉得 Thread 类和 Runable 接口的最大区别是什么?

Thread 是一个类,Runnable 是一个接口,Thread 类实现了 Runnable 接口

4、说一说 run() 方法和 start() 的区别?

不会。

5、说一说 wait() 和 sleep() 的区别?

sleep() 只会让出 CPU,不会释放锁;wait() 又让出 CPU,又释放锁。

6、说一说 notify() 和 notifyAll() 的区别以及使用场景?

notify() 是随机唤醒一个等待该资源的线程,而notifyAll()是唤醒所有等待该资源的线程。

volitale连环炮

1、volitale 了解吗?简单介绍一下

volatile是一个关键字,用来修饰共享变量。当一个共享变量加上了volatile关键字后,假如一个线程修改了这个变量的值,那么其他变量都可见。此外,关于这个共享变量的指令不会被重排序,从而防止了变量更新 不符合预期的问题。

synchronized连环炮

1、简单说一下 synchronized 的作用?

synchronized是一个关键字,一般加在方法或者代码块上。但是无论它加在方法还是代码块上,本质上都是用来修饰对象。通过加上synchronized关键字,就可以对对象进行加锁从而实现线程同步。

CAS连环炮

1、简单介绍一下 CAS,什么是 CAS ?

由于synchronized关键字底层是基于悲观锁的,所以开销太大。我们想要一个不加锁的操作,比如CAS。CAS是一个原子操作,它不用加锁。

举个例子:比如内存中有一个value=10。

(1)将value=10拿出来赋值给A

(2)对A进行操作,比如A+1=B

(3)判断A与value是否相等,若相等证明value没有被修改,那就将B写入value。若不相等证明已经被改了,就回滚。

2、CAS 是如何解决 ABA 问题的?

在每次修改值的时候加上版本号。

线程池连环炮

1、为什么要使用线程池?

如果没有线程池的话,一个线程需要串行执行很多个任务,这样子太慢了。所以引入线程池,让多个线程同时执行任务。

2、线程池是怎么提升效率的?简单说一下线程池都有哪些可选参数?

看图说话:

3、线程数是越大越好吗?讲一下核心线程数与最大线程数之间的关系?

线程数并不是越多越好,高峰时期任务可能会比较多,这时候线程数可以多一点,但是不是高峰期的时候任务会比较少,不需要这么多线程。

最大线程数=核心线程数+非核心线程数。

4、运行的时候,核心线程数能不能修改?

可以。

5、一个任务进来后,线程池是怎么处理的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值