java多线程代码面试 java面试 多线程

2021面试网络工程师的题目面试的目的是确定面试者如何处理他们所选择的研究领域的问题,以及他们如何批判性地思考问题 。下面我给大家带来2021面试网络工程师的题目参考 , 希望能帮助到大家!
Java多线程面试题目
1、什么是线程?
线程是操作系统能够进行运算调度的最小单位 , 它被包含在进程之中,是进程中的实际运作单位 。程序员可以通过它进行多处理器编程 , 你可以使用多线程对运算密集型任务提速 。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒 。
2、线程和进程有什么区别?
【java多线程代码面试 java面试 多线程】 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务 。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间 。每个线程都拥有单独的栈内存用来存储本地数据 。
3、如何在Java中实现线程?
两种方式:java.lang.Thread类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread类或者直接调用Runnable接口来重写run()方法实现线程 。
4、Java 关键字volatile 与 synchronized 作用与区别?
Volatile:
它所修饰的变量不保留拷贝,直接访问主内存中的 。
在Java内存模型中,有main memory,每个线程也有自己的memory(例如寄存器) 。为了性能,一个线程会在自己的memory中保持要访问的变量的副本 。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值 , 或者mainmemory中的值不一致的情况 。一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中 。
synchronized:
当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码 。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行 。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块 。
二、然而 , 当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块 。
三、尤其关键的是 , 当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞 。
四、当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁 。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞 。
五、以上规则对其它对象锁同样适用 。
5、有哪些不同的线程生命周期?
当我们在Java程序中新建一个线程时,它的状态是New 。当我们调用线程的start()方法时 , 状态被改变为Runnable 。线程调度器会为Runnable线程池中的线程分配CPU时间并且讲它们的状态改变为Running 。其他的线程状态还有Waiting,Blocked和Dead 。
6、你对线程优先级的理解是什么?
每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OSdependent) 。
我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行 。线程优先级是一个int变量(从1-10),1代表最低优先级 , 10代表最高优先级 。
7、什么是死锁(Deadlock)?如何分析和避免死锁?
死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源 。
分析死锁,我们需要查看Java应用程序的线程转储 。我们需要找出那些状态为BLOCKED的线程和他们等待的资源 。每个资源都有一个唯一的id , 用这个id我们可以找出哪些线程已经拥有了它的对象锁 。
避免嵌套锁,只在需要的地方使用锁和避免无限期等待是避免死锁的通常办法 。
8、什么是线程安全?Vector是一个线程安全类吗?
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的 。
一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误 。很显然你可以将集合类分成两组,线程安全和非线程安全的 。Vector是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的 。
9、Java中如何停止一个线程?
Java提供了很丰富的API但没有为停止线程提供API 。JDK 1.0本来有一些像stop(),suspend()和resume()的控制方法但是由于潜在的死锁威胁因此在后续的JDK版本中他们被弃用了,之后JavaAPI的设计者就没有提供一个兼容且线程安全的方法来停止一个线程 。
当run()或者 call()方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用volatile布尔变量来退出run()方法的循环或者是取消任务来中断线程 。
10、什么是ThreadLocal?
ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术 。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量 。
每个线程都会拥有他们自己的Thread变量,它们可以使用get()set()方法去获取他们的默认值或者在线程内部改变他们的值 。ThreadLocal实例通常是希望它们同线程状态关联起来是privatestatic属性 。
Kubernetes面试题汇总
1、什么是Kubernetes?
Kubernetes是一个开源容器管理工具 , 负责容器部署 , 容器扩缩容以及负载平衡 。作为Google的创意之作,它提供了出色的社区,并与所有云提供商合作 。因此,我们可以说Kubernetes不是一个容器化平台,而是一个多容器管理解决方案 。
2、Kubernetes与Docker有什么关系?
众所周知,Docker提供容器的生命周期管理,Docker镜像构建运行时容器 。但是,由于这些单独的容器必须通信,因此使用Kubernetes 。因此,我们说Docker构建容器,这些容器通过Kubernetes相互通信 。因此,可以使用Kubernetes手动关联和编排在多个主机上运行的容器 。
3、什么是Container Orchestration?
考虑一个应用程序有5-6个微服务的场景 。现在,这些微服务被放在单独的容器中,但如果没有容器编排就无法进行通信 。因此,由于编排意味着所有乐器在音乐中和谐共处,所以类似的容器编排意味着各个容器中的所有服务协同工作以满足单个服务器的需求 。
4、Kubernetes如何简化容器化部署?
由于典型应用程序将具有跨多个主机运行的容器集群,因此所有这些容器都需要相互通信 。因此,要做到这一点,你需要一些能够负载平衡,扩展和监控容器的东西 。由于Kubernetes与云无关并且可以在任何公共/私有提供商上运行,因此必须是您简化容器化部署的选择 。
5、您对Kubernetes的集群了解多少?
Kubernetes背后的基础是我们可以实施所需的状态管理,我的意思是我们可以提供特定配置的集群服务,并且集群服务将在基础架构中运行并运行该配置 。
因此,正如您所看到的,部署文件将具有提供给集群服务所需的所有配置 。现在 , 部署文件将被提供给API , 然后由集群服务决定如何在环境中安排这些pod,并确保正确运行的pod数量 。
因此 , 位于服务前面的API,工作节点和节点运行的Kubelet进程,共同构成了Kubernetes集群 。
6、Kubernetes Architecture的不同组件有哪些?
Kubernetes Architecture主要有两个组件 -主节点和工作节点 。如下图所示,master和worker节点中包含许多内置组件 。主节点具有kube-controller-manager,kube-apiserver,kube-scheduler等 。而工作节点具有在每个节点上运行的kubelet和kube-proxy 。
7、您能否介绍一下Kubernetes中主节点的工作情况?
Kubernetesmaster控制容器存在的节点和节点内部 。现在,这些单独的容器包含在容器内部和每个容器内部,您可以根据配置和要求拥有不同数量的容器 。
因此,如果必须部署pod,则可以使用用户界面或命令行界面部署它们 。然后,在节点上调度这些pod , 并根据资源需求,将pod分配给这些节点 。kube-apiserver确保在Kubernetes节点和主组件之间建立通信 。
8、kube-apiserver和kube-scheduler的作用是什么?
kube-apiserver遵循横向扩展架构 , 是主节点控制面板的前端 。这将公开Kubernetes主节点组件的所有API , 并负责在Kubernetes节点和Kubernetes主组件之间建立通信 。
kube-scheduler负责工作节点上工作负载的分配和管理 。因此,它根据资源需求选择最合适的节点来运行未调度的pod,并跟踪资源利用率 。它确保不在已满的节点上调度工作负载 。
9、你对Kubernetes的负载均衡器有什么了解?
负载均衡器是暴露服务的最常见和标准方式之一 。根据工作环境使用两种类型的负载均衡器,即内部负载均衡器或外部负载均衡器 。内部负载均衡器自动平衡负载并使用所需配置分配容器,而外部负载均衡器将流量从外部负载引导至后端容器 。
10、Replica Set 和 Replication Controller之间有什么区别?
Replica Set 和 ReplicationController几乎完全相同 。它们都确保在任何给定时间运行指定数量的pod副本 。不同之处在于复制pod使用的选择器 。ReplicaSet使用基于集合的选择器,而Replication Controller使用基于权限的选择器 。
Equity-Based选择器:这种类型的选择器允许按标签键和值进行过滤 。因此,在外行术语中,基于Equity的选择器将仅查找与标签具有完全相同短语的pod 。
示例:假设您的标签键表示app = nginx,那么,使用此选择器,您只能查找标签应用程序等于nginx的那些pod 。
Selector-Based选择器:此类型的选择器允许根据一组值过滤键 。因此,换句话说,基于Selector的选择器将查找已在集合中提及其标签的pod 。
示例:假设您的标签键在(nginx,NPS,Apache)中显示应用程序 。然后,使用此选择器 , 如果您的应用程序等于任何nginx,NPS或Apache,则选择器将其视为真实结果 。
渗透攻击的测试步骤
1.如果原始值为2,我们使用(1 1)或(3-1),程序作出相同回应,表明易受攻击
2.如果单引号被过滤掉 , 我们可以用ASCII命令,使它返回字符的数字化代码,如51-ASCII(1)
3.在URL编码中,和=用于链接名称/值对,建立查询字符串应当分别使用&和=进行编码
4.如查询字符串不允许使用空格 , 使用 或 编码
5.分号被用于分割cookie自读,使用=编码
2021面试网络工程师的题目

    推荐阅读