Ryan's Blog

能不能谈谈你对线程安全的理解?

能不能谈谈你对线程安全的理解? 典型回答 线程安全是指某个函数在并发环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。 简单来说,就是多个线程同时访问共享变量的时候,得到的结果和我们预期的一样,就是线程安全。所以有四个关键词:并发、多线程、共享变量、正确完成。这里所谓的正确完成,其实就是要满足所谓的原子性、有序性和可见性。 知识扩展 并发与并行 什么是并发...

线程池的拒绝策略有哪些?

线程池的拒绝策略有哪些? 典型回答 在Java中,线程池的拒绝策略决定了在任务队列已满的情况下,如何处理新提交的任务。当线程池达到最大容量,并且任务队列也已满时,拒绝策略就会起作用。Java提供了四种内置的拒绝策略,它们分别是: AbortPolicy - 这是默认的拒绝策略,当线程池无法接受新任务时,会抛出RejectedExecutionException异常。这意味着新任务...

线程有几种状态,状态之间的流转是怎样的?

线程有几种状态,状态之间的流转是怎样的? 典型回答 Java中线程的状态分为6种: 1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 2.运行(RUNNABLE):Java线程中将就绪(READY)和运行中(RUNNING)两种状态笼统的称为“运行”。 就绪(READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态...

线程是如何被调度的?

线程是如何被调度的? 典型回答 对于单CPU的计算机来说,在任意时刻只能执行一条机器指令,每个线程只有获得CPU的使用权才能执行指令。 所谓多线程的并发运行,其实是指从宏观上看,各个线程轮流获得CPU的使用权,分别执行各自的任务。 前面关于线程状态的介绍中,我们知道,线程的运行状态中包含两种子状态,即就绪(READY)和运行中(RUNNING)。 而一个线程想要从就绪状态变成运行中...

线程数设定成多少更合适?

线程数设定成多少更合适? 典型回答 线程数设定是个高频出现的题目,这个题目对于优秀的面试官希望得到的答案是面试者的思考过程,考察其分析线程数设定的思考方向是否全面(主要包括对操作系统线程的理解和实际设置经验)。比较差的面试官才会认为固定的公式是正确的。 首先看一下影响线程数的因素可能有哪些? 影响线程数的因素 线程数的设定需要根据应用程序的需求和运行环境来决定,没有一个固定的...

有哪些实现线程安全的方案_

有哪些实现线程安全的方案? 典型回答 在编程中,如果遇到并发安全的情况,有哪些方案可以来实现线程安全呢?以下是几个常见的方案(本文没有局限某种编程语言,而是说的整体思想): 1、单线程 想要实现线程安全,最简单的方式就是干脆不支持多线程,只用单线程来执行,那么就可以从根本上杜绝线程安全的问题了。比如Redis,就是这种思想,在命令执行时,只依赖单线程进行。 Redis为什么被设计...

有了synchronized为什么还需要volatile_

有了synchronized为什么还需要volatile? 典型回答 synchronized其实是一种加锁机制,那么既然是锁,天然就具备以下几个缺点: 1、有性能损耗:虽然在JDK 1.6中对synchronized做了很多优化,如适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等。但是他毕竟还是一种锁。所以,无论是使用同步方法还是同步代码块,在同步操作之前还是要进行加锁,同步操作之后需要...

有了mesi为啥还需要jmm?

有了MESI为啥还需要JMM? 典型回答 MESI协议和Java内存模型(JMM)虽然都旨在解决多线程环境中的数据一致性问题,但它们工作在不同的层面上,并且解决的问题范围和目的不同。 MESI协议是硬件层面的缓存一致性协议,用于确保在多核处理器系统中,不同处理器缓存中的缓存内容保持数据一致性。它主要关注的是处理器缓存之间的一致性问题,通过四种状态(Modified, Exclusive...