java多线程编程面试题_linux多线程面试题

java多线程编程面试题_linux多线程面试题一、多线程的几种实现方式,什么是线程安全。四种:继承Thread类,实现Runnable接口,实现Callable接口,使用线程池。线程安全:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。(Java并发编程实战)最核心的概念是正确性。正确性:某个类的行为与其规范完全一致。二、volatile的原理,作用,能代替锁么。volatile的理解三、画一个…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

文章目录

创建子线程时,子线程是得不到父线程的 ThreadLocal,有什么办法可以解决这个问题?

答:这道题主要考察线程的属性和创建过程,可以这么回答。

可以使用 InheritableThreadLocal 来代替 ThreadLocal,ThreadLocal 和 InheritableThreadLocal 都是线程的属性,所以可以做到线程之间的数据隔离,在多线程环境下我们经常使用,但在有子线程被创建的情况下,父线程 ThreadLocal 是无法传递给子线程的,但 InheritableThreadLocal 可以,主要是因为在线程创建的过程中,会把

InheritableThreadLocal 里面的所有值传递给子线程,具体代码如下:

// 当父线程的 inheritableThreadLocals 的值不为空时
// 会把 inheritableThreadLocals 里面的值全部传递给子线程
if (parent.inheritableThreadLocals != null)
    this.inheritableThreadLocals =
        ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);

多线程的几种实现方式,什么是线程安全。

四种:
1、继承Thread类,重写run()方法,
2、实现Runnable接口,实现run()方法
3、实现Callable接口,重写call()方法
与Runnable接口相比,可以实现的功能:提供返回值,抛出异常,拿到Future对象,获取异步的结果。
4、使用线程池。

慕课网

实现Runnable接口和继承Thread类哪个更好?

Runnable接口更好
1、代码架构角度
具体的任务,run方法里面的任务,创建线程。从生命周期的角度看,实现Runnable接口可以实现解耦。
2、新建线程的损耗
Thread需要new,还要销毁;Runnable可以反复利用一个线程
3、Java不支持多继承

volatile的原理,作用,能代替锁么。

volatile的理解

画一个线程的生命周期状态图。

在这里插入图片描述
1、新建状态(New)

用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。

注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。

2、就绪状态(Runnable)

处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线 程就绪队列(尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。因为cpu的调度不一定是按照先进先出的顺序来调度的),等待系统为其分配 CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调 度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。

提示:如果希望子线程调用start()方法后立即执行,可以使用Thread.sleep()方式使主线程睡眠一伙儿,转去执行子线程。

3、运行状态(Running)

处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

处于就绪状态的线程,如果获得了cpu的调度,就会从就绪状态变为运行状态,执行run()方法中的任务。如果该线程失去了cpu资源,就会又从运 行状态变为就绪状态。重新等待系统分配资源。也可以对在运行状态的线程调用yield()方法,它就会让出cpu资源,再次变为就绪状态。

当发生如下情况是,线程会从运行状态变为阻塞状态:

①、线程调用sleep方法主动放弃所占用的系统资源

②、线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞

③、线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有

④、线程在等待某个通知(notify)

⑤、程序调用了线程的suspend方法将线程挂起。不过该方法容易导致死锁,所以程序应该尽量避免使用该方法。

当线程的run()方法执行完,或者被强制性地终止,例如出现异常,或者调用了stop()、desyory()方法等等,就会从运行状态转变为死亡状态。

4、阻塞状态(Blocked)

处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁(synchronized)被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。有三种方法可以暂停Threads执行。

5、死亡状态(Dead)

需要说明的是,synchronized锁和调用wait()的对象应为同一对象!否则会报java.lang.IllegalMonitorStateException错误。
详细说明

什么是线程?它与进程有什么区别?为什么要使用多线程

线程是指程序在执行过程中,能够执行程序代码的一个执行单元。Java语言中,线程有4中状态:运行、就绪、挂起和结束。
进程是指一段正在执行的程序。
线程也被称为轻量级进程,是程序执行的最小单元,一个进程可以有多个线程,各个线程之间共享程序的内存单元和进程级资源,但是各个线程都有自己的栈空间。
为什么使用多线程?原因:
1、可以减少程序的响应时间。单线程情况下,某个操作很耗时,就会。。
2、线程的创建和切换开销更小。
3、多CPU或多核计算机本身就有执行多线程的能力。
4、简化程序结构,便于理解和维护。

同步和异步有什么区别

同步:数据共享问题,当多个线程需要访问同一个资源时,需要确保某一时刻只能被一个线程使用,能够保证资源的安全。
异步:每个线程都包含了运行时自己所需要的数据或方法。在进程输入输出的时候,不必关心其他线程的状态或行为。

run()方法和start()方法有什么区别

start()方法来启动一个线程,该线程处于就绪状态,可以被JVM来调度。JVM通过调用run()方法来完成实际的操作。(异步)
如果直接调用run()方法,则是普通的函数调用。(同步)

一个线程两次调用start()方法会出现什么情况?为什么?

会出现IllegalThreadStateException异常;start()方法调用时候会先检查状态,不符合所以会抛出异常

多线程同步的实现方法有哪些

(1)synchronized关键字
~~synchronized方法
~~synchronized块
(2)wait()方法与notify()方法
(3)Lock
~~lock()不会抛出异常
~~tryLock()
~~tryLock(long timeout,TimeUnit unit)
~~lockInterruptibly()

sleep和wait的区别。

sleep()和wait()都是使线程暂停执行一段时间的方法。区别如下:
(1)原理
sleep()是Thread类的静态方法,是线程控制自身流程的
wait()方法是Object类的方法,用于线程间通信,其他线程调用notify()方法才“醒”来,也可以设定一个时间。
(2)锁的处理机制不同
sleep()不会释放锁,wait()会。
(3)使用区域不同
wait()只能在同步方法或块,sleep()在任何地方。

sleep和sleep(0)的区别。

Sleep(0),如果线程调度器的可运行队列中有大于或等于当前线程优先级的就绪线程存在,操作系统会将当前线程从处理器上移除,调度其他优先级高的就绪线程运行;如果可运行队列中的没有就绪线程或所有就绪线程的优先级均低于当前线程优先级,那么当前线程会继续执行,就像没有调用 Sleep(0)一样。

sleep和yield方法的区别

1、sleep方法给其他线程运行机会时不考虑线程的优先级,因此会给低线程优先级运行的机会,而yield方法只会给相同优先级或者更高优先级线程运行的机会

2、线程执行sleep()方法后转入阻塞状态,所以,执行sleep()方法的线程在指定的时间内不会被执行,而yield()方法只是使当前线程重新回到可执行状态,所以执行yield()方法的线程可能在进入可执行状态后马上又被执行

3、sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常

4、sleep()方法比yield()方法(跟操作系统相关)有更好的可移植性

终止线程的方法有哪些

stop()和suspend()方法

Lock与Synchronized的区别 。

(1)用法
(2)性能
(3)锁机制

join()方法的作用是什么

让调用该方法的线程在执行完run()后,再执行join方法后面的代码。

synchronized的原理是什么,一般用在什么地方(比如加在静态方法和非静态方法的区别,静态方法和非静态方法同时执行的时候会有影响吗)

原理
static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。所以,他们之间不会产生互斥。

解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。

https://blog.csdn.net/qq_33805483/article/details/104099367

用过哪些原子类,他们的原理是什么。

AtomicInteger,原理CAS,unSafe类。

JUC下研究过哪些并发工具,讲讲原理。

提供了线程池的创建类 ThreadPoolExecutor、Executors 等;
提供了各种锁,如 Lock、ReentrantLock 等;
提供了各种线程安全的数据结构,如 ConcurrentHashMap、LinkedBlockingQueue、DelayQueue 等;
提供了更加高级的线程同步结构,如 CountDownLatch、CyclicBarrier、Semaphore 等。

用过线程池吗,如果用过,请说明原理,并说说newCache和newFixed有什么区别,构造函数的各个参数的含义是什么,比如coreSize,maxsize等。

线程池
newCache是创建可扩容的带有缓存的一池多线程
newFixed是创建固定个数的线程池

线程池的关闭方式有几种,各自的区别是什么。

shutdown:
1、调用之后不允许继续往线程池内继续添加线程;
2、线程池的状态变为SHUTDOWN状态;
3、所有在调用shutdown()方法之前提交到ExecutorSrvice的任务都会执行;
4、一旦所有线程结束执行当前任务,ExecutorService才会真正关闭。

shutdownNow():
1、该方法返回尚未执行的 task 的 List;
2、线程池的状态变为STOP状态;
3、阻止所有正在等待启动的任务, 并且停止当前正在执行的任务。

假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有10个线程同时调用它,如何做到。

ScheduledThreadPoolExecutor 设置定时,进行调度,可以用来在给定延时后执行异步任务或者周期性执行任务。

 public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) { 
    	  
      super(corePoolSize, Integer.MAX_VALUE, 0,TimeUnit.NANOSECONDS, new DelayedWorkQueue(),threadFactory);
 }

spring的controller是单例还是多例,怎么保证并发的安全。

单例,通过单例工厂 DefaultSingletonBeanRegistry实现单例;
AsyncTaskExecutor保证并发的安全。

用三个线程按顺序循环打印abc三个字母,比如abcabcabc。

public static void main(String[] args) { 
   
	final String str=”abc”;
	ExecutorService executorService= Executors.newFixedThreadPool(3);
	executorService.execute(new Runnable() { 
   
	@Override
	public void run() { 
   
	System.out.println(1+str);
	}
	});executorService.execute(new Runnable() { 
   
	@Override
	public void run() { 
   
	System.out.println(2+str);
	}
	});executorService.execute(new Runnable() { 
   
	@Override
	public void run() { 
   
	System.out.println(2+str);
	}
	});
}

ThreadLocal用过么,用途是什么,原理是什么,用的时候要注意什么。

ThreadLocal有什么用

如果让你实现一个并发安全的链表,你会怎么做。

Collections.synchronizedList() ConcurrentLinkedQueue

有哪些无锁数据结构,他们实现的原理是什么。

CAS基于jdk提供的原子类原语实现,例如AtomicReference

讲讲java同步机制的wait和notify。

CAS机制是什么,如何解决ABA问题。

CAS

多线程如果线程挂住了怎么办。

根据具体情况(sleep,wait,join等),酌情选择notifyAll,notify进行线程唤醒。

countdowlatch和cyclicbarrier的内部原理和用法,以及相互之间的差别(比如countdownlatch的await方法和是怎么实现的)。

1
2

对AbstractQueuedSynchronizer了解多少,讲讲加锁和解锁的流程,独占锁和公平锁

简述ConcurrentLinkedQueue和LinkedBlockingQueue的用处和不同之处。

导致线程死锁的原因?怎么解除线程死锁。

非常多个线程(可能是不同机器),相互之间需要等待协调,才能完成某种工作,问怎么设计这种协调方案。

用过读写锁吗,原理是什么,一般在什么场景下用。

开启多个线程,如果保证顺序执行,有哪几种实现方式,或者如何保证多个线程都执行完再拿到结果。

延迟队列的实现方式,delayQueue和时间轮算法的异同。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/175594.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Unity3d的Log系统重构

    Unity3d的Log系统重构

  • Elasticsearch系列——关闭Elasticsearch进程,并重新启动「建议收藏」

    Elasticsearch系列——关闭Elasticsearch进程,并重新启动「建议收藏」前言有一种情况,当我们启动elasticsearch之后,经过很长一段时间没有操作,自己已经忘了是否已经启动了elasticsearch,这时候我们可以通过下面的方式验证是否启动,并重新启动:step1查找ES进程号ps-ef|grepelastic注意:下面的那个进程是当前这条命令的,不是真正的elasticsearch进程step2杀掉ES进程…

  • 游戏建模学习经验分享

    游戏建模学习经验分享最近通过很多师弟的交流,我发现游戏建模初学者大多存在三个大问题,一是工具的使用不够熟练,甚至有些功能还不知道,二是对布线的规范没有太大的要求和了解,三是对游戏制作流程不清晰和板绘下的功力不够,对贴图制作用工少,甚至有些人还处于一直做白膜的阶段,那么对大多说想要要学游戏建模的学习者想要学什么:低模,高模制作,贴图材质,动作特效。毕竟很多人学的并没有那么快,建模实质就是孰能生巧,做的东西多了,遇到问题多了,解决之后就会学的更多。今天就跟大家聊一聊目前我遇到新手关于建模方面的问题。1:工具使用不熟练很多师

  • pycharm中安装opencv_pycharm安装opencv库出错

    pycharm中安装opencv_pycharm安装opencv库出错Pycharm安装opencv的几种方法之前在默认环境中用pip安装过一次opencv,当时就是参考比人方法弄,稀里糊涂的,然后今天想在自己别的环境下(tensorflow)下安装终于弄懂了一些,暂时发现了几种安装的方法,特此记录下。方法1:在Pycharm自带的库中下载(暂且这么叫吧,如下图)这个方法我也是看别人说的,自己还没试过,描述也没介绍版本啥的,所以个人也不推荐…方法2:就是…

  • 数据结构——栈的详解[通俗易懂]

    栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和线性表大不相同的两类重要的的抽象数据类型。C语言和C++中的栈C语言中的栈栈的定义C语言中栈的基本操作栈的初始化判断是否为空栈判断是否为满栈入栈出栈C语言实现栈的具体代码C++中的栈C++中栈的基…

  • 腾讯ssl 免费证书_腾讯云ssl证书安装教程

    腾讯ssl 免费证书_腾讯云ssl证书安装教程项目收尾,闲下来捣腾捣腾微信小程序,配置request域名的时候发现需要https协议,意思就是请求服务端必须是HTTPS,当然,如果你只是自己玩一玩小程序开发,不上线,也可以通过微信开发者工具设置使用普通http请求来让自己过把瘾。大部分ssl证书都需要money,对于个人开发者成本有点高,像我这种穷屌当然是想方设法去找免费的ssl。推荐一篇博文,里面罗列了大部分免费的ssl证书认证点击打开链接…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号