当前位置: 首页 > news >正文

如何做营销型手机网站优化免费无代码开发平台本地部署

如何做营销型手机网站优化,免费无代码开发平台本地部署,wordpress插件 商品,平面设计公司赚钱吗文章目录 1. 什么是线程和进程?2. 请简要描述线程与进程的关系,区别及优缺点#xff1f;3. 什么是堆和方法区#xff1f;4. 并发与并行的区别5. 同步和异步的区别6.为什么要使用多线程? 优点#xff1f;#xff08;重要#xff09;7. 使用多线程可能带来什么问题?8. 如… 文章目录 1. 什么是线程和进程?2. 请简要描述线程与进程的关系,区别及优缺点3. 什么是堆和方法区4. 并发与并行的区别5. 同步和异步的区别6.为什么要使用多线程? 优点重要7. 使用多线程可能带来什么问题?8. 如何理解线程安全和不安全9. 单核 CPU 上运行多个线程效率一定会高吗10. 如何创建线程重要11. 说说线程的生命周期和状态?(重点)12. 什么是线程上下文切换?13. 什么是线程死锁?如何避免死锁?14. 可以直接调用 Thread 类的 run 方法吗15. 乐观锁和悲观锁16. synchronized 关键字17. 共享锁和独占锁有什么区别18. StringBuilder和StringBuffer区别重要19. MAP重要19.1 HashMap 和 Hashtable 的区别19.2 HashMap 的底层实现 20. ArrayList 和 LinkedList 的区别 重要 1. 什么是线程和进程? 何为进程? 进程是程序的一次执行过程是系统运行程序的基本单位因此进程是动态的。系统运行一个程序即是一个进程从创建运行到消亡的过程。何为线程? 线程与进程相似但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源但每个线程有自己的程序计数器、虚拟机栈和本地方法栈所以系统在产生一个线程或是在各个线程之间做切换工作时负担要比进程小得多也正因为如此线程也被称为轻量级进程。 2. 请简要描述线程与进程的关系,区别及优缺点 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的而各线程则不一定因为同一进程中的线程极有可能会相互影响。线程执行开销小但不利于资源的管理和保护而进程正相反。 3. 什么是堆和方法区 堆和方法区是所有线程共享的资源其中堆是进程中最大的一块内存主要用于存放新创建的对象 (几乎所有对象都在这里分配内存)方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 4. 并发与并行的区别 并发两个及两个以上的作业在同一 时间段 内执行。并行两个及两个以上的作业在同一 时刻 执行。 最关键的点是是否是 同时 执行。 5. 同步和异步的区别 同步发出一个调用之后在没有得到结果之前 该调用就不可以返回一直等待。异步调用在发出之后不用等待返回结果该调用直接返回。 6.为什么要使用多线程? 优点重要 先从总体上来说 从计算机底层来说 线程可以比作是轻量级的进程是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外多核 CPU 时代意味着多个线程可以同时运行这减少了线程上下文切换的开销。从当代互联网发展趋势来说 现在的系统动不动就要求百万级甚至千万级的并发量而多线程并发编程正是开发高并发系统的基础利用好多线程机制可以大大提高系统整体的并发能力以及性能。 再深入到计算机底层来探讨 单核时代在单核时代多线程主要是为了提高单进程利用 CPU 和 IO 系统的效率。 假设只运行了一个 Java 进程的情况当我们请求 IO 的时候如果 Java 进程中只有一个线程此线程被 IO 阻塞则整个进程被阻塞。CPU 和 IO 设备只有一个在运行那么可以简单地说系统整体效率只有 50%。当使用多线程的时候一个线程被 IO 阻塞其他线程还可以继续使用 CPU。从而提高了 Java 进程利用系统资源的整体效率。多核时代: 多核时代多线程主要是为了提高进程利用多核 CPU 的能力。举个例子假如我们要计算一个复杂的任务我们只用一个线程的话不论系统有几个 CPU 核心都只会有一个 CPU 核心被利用到。而创建多个线程这些线程可以被映射到底层多个 CPU 上执行在任务中的多个线程没有资源竞争的情况下任务执行的效率会有显著性的提高约等于单核时执行时间/CPU 核心数。 7. 使用多线程可能带来什么问题? 并发编程的目的就是为了能提高程序的执行效率进而提高程序的运行速度但是并发编程并不总是能提高程序运行速度的而且并发编程可能会遇到很多问题比如内存泄漏、死锁、线程不安全等等。 8. 如何理解线程安全和不安全 线程安全和不安全是在多线程环境下对于同一份数据的访问是否能够保证其正确性和一致性的描述。 线程安全指的是在多线程环境下对于同一份数据不管有多少个线程同时访问都能保证这份数据的正确性和一致性。线程不安全则表示在多线程环境下对于同一份数据多个线程同时访问时可能会导致数据混乱、错误或者丢失。 9. 单核 CPU 上运行多个线程效率一定会高吗 单核 CPU 同时运行多个线程的效率是否会高取决于线程的类型和任务的性质。一般来说有两种类型的线程CPU 密集型和 IO 密集型。CPU 密集型的线程主要进行计算和逻辑处理需要占用大量的 CPU 资源。IO 密集型的线程主要进行输入输出操作如读写文件、网络通信等需要等待 IO 设备的响应而不占用太多的 CPU 资源。 在单核 CPU 上同一时刻只能有一个线程在运行其他线程需要等待 CPU 的时间片分配。如果线程是 CPU 密集型的那么多个线程同时运行会导致频繁的线程切换增加了系统的开销降低了效率。如果线程是 IO 密集型的那么多个线程同时运行可以利用 CPU 在等待 IO 时的空闲时间提高了效率。 因此对于单核 CPU 来说如果任务是 CPU 密集型的那么开很多线程会影响效率如果任务是 IO 密集型的那么开很多线程会提高效率。当然这里的“很多”也要适度不能超过系统能够承受的上限。 10. 如何创建线程重要 一般来说创建线程有很多种方式例如继承Thread类、实现Runnable接口、实现Callable接口、使用线程池、使用CompletableFuture类等等。 不过这些方式其实并没有真正创建出线程。准确点来说这些都属于是在 Java 代码中使用多线程的方法。 严格来说Java 就只有一种方式可以创建线程那就是通过new Thread().start()创建。不管是哪种方式最终还是依赖于new Thread().start()。 11. 说说线程的生命周期和状态?(重点) Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态 NEW: 初始状态线程被创建出来但没有被调用 start() 。RUNNABLE: 运行状态线程被调用了 start()等待运行的状态。BLOCKED阻塞状态需要等待锁释放。WAITING等待状态表示该线程需要等待其他线程做出一些特定动作通知或中断。TIME_WAITING超时等待状态可以在指定的时间后自行返回而不是像 WAITING 那样一直等待。TERMINATED终止状态表示该线程已经运行完毕。 12. 什么是线程上下文切换? 线程在执行过程中会有自己的运行条件和状态也称上下文比如上文所说到过的程序计数器栈信息等。当出现如下情况的时候线程会从占用 CPU 状态中退出。 主动让出 CPU比如调用了 sleep(), wait() 等。时间片用完因为操作系统要防止一个线程或者进程长时间占用 CPU 导致其他线程或者进程饿死。调用了阻塞类型的系统中断比如请求 IO线程被阻塞。被终止或结束运行 这其中前三种都会发生线程切换线程切换意味着需要保存当前线程的上下文留待线程下次占用 CPU 的时候恢复现场。并加载下一个将要占用 CPU 的线程上下文。这就是所谓的 上下文切换。 上下文切换是现代操作系统的基本功能因其每次需要保存信息恢复信息这将会占用 CPU内存等系统资源进行处理也就意味着效率会有一定损耗如果频繁切换就会造成整体效率低下。 13. 什么是线程死锁?如何避免死锁? 线程死锁是多个线程同时被阻塞它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞因此程序不可能正常终止。 如何预防死锁 破坏死锁的产生的必要条件即可 破坏请求与保持条件一次性申请所有的资源。破坏不剥夺条件占用部分资源的线程进一步申请其他资源时如果申请不到可以主动释放它占有的资源。破坏循环等待条件靠按序申请资源来预防。按某一顺序申请资源释放资源则反序释放。破坏循环等待条件。 如何避免死锁 避免死锁就是在资源分配时借助于算法比如银行家算法对资源分配进行计算评估使其进入安全状态。 14. 可以直接调用 Thread 类的 run 方法吗 new 一个 Thread线程进入了新建状态。调用 start()方法会启动一个线程并使线程进入了就绪状态当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作然后自动执行 run() 方法的内容这是真正的多线程工作。 但是直接执行 run() 方法会把 run() 方法当成一个 main 线程下的普通方法去执行并不会在某个线程中执行它所以这并不是多线程工作。 需要重写run()方法实现多线程 15. 乐观锁和悲观锁 什么是悲观锁 悲观锁总是假设最坏的情况认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改)所以每次在获取资源操作的时候都会上锁这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说共享资源每次只给一个线程使用其它线程阻塞用完后再把资源转让给其它线程。 什么是乐观锁 乐观锁总是假设最好的情况认为共享资源每次被访问的时候不会出现问题线程可以不停地执行无需加锁也无需等待只是在提交修改的时候去验证对应的资源也就是数据是否被其它线程修改了具体方法可以使用版本号机制或 CAS 算法。 理论上来说 悲观锁通常多用于写比较多的情况多写场景竞争激烈这样可以避免频繁失败和重试影响性能悲观锁的开销是固定的。不过如果乐观锁解决了频繁失败和重试这个问题的话比如LongAdder也是可以考虑使用乐观锁的要视实际情况而定。乐观锁通常多用于写比较少的情况多读场景竞争较少这样可以避免频繁加锁影响性能。不过乐观锁主要针对的对象是单个共享变量。 16. synchronized 关键字 synchronized 是什么有什么用 synchronized 是 Java 中的一个关键字翻译成中文是同步的意思主要解决的是多个线程之间访问资源的同步性可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 17. 共享锁和独占锁有什么区别 共享锁一把锁可以被多个线程同时获得。 独占锁一把锁只能被一个线程获得。 18. StringBuilder和StringBuffer区别重要 a. 相同点: 用法一样,作用一样 b. 不同点: StringBuilder:拼接效率比StringBuffer高线程不安全 StringBuffer:效率比较底,线程安全 拼接效率:StringBuilderStringBufferString 19. MAP重要 19.1 HashMap 和 Hashtable 的区别 线程是否安全 HashMap 是非线程安全的Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过synchronized 修饰。效率 因为线程安全的问题HashMap 要比 Hashtable 效率高一点。另外Hashtable 基本被淘汰不要在代码中使用它对 Null key 和 Null value 的支持 HashMap 可以存储 null 的 key 和 value但 null 作为键只能有一个null 作为值可以有多个Hashtable 不允许有 null 键和 null 值否则会抛出 NullPointerException。初始容量大小和每次扩充容量大小的不同 ① 创建时如果不指定容量初始值Hashtable 默认的初始大小为 11之后每次扩充容量变为原来的 2n1。HashMap 默认的初始化大小为 16。之后每次扩充容量变为原来的 2 倍。② 创建时如果给定了容量初始值那么 Hashtable 会直接使用你给定的大小而 HashMap 会将其扩充为 2 的幂次方大小。也就是说 HashMap 总是使用 2 的幂作为哈希表的大小。底层数据结构 JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化当链表长度大于阈值默认为 8时将链表转化为红黑树将链表转换成红黑树前会判断如果当前数组的长度小于 64那么会选择先进行数组扩容而不是转换为红黑树以减少搜索时间后文中我会结合源码对这一过程进行分析。Hashtable 没有这样的机制。 19.2 HashMap 的底层实现 实现原理 HashMap 实际上是一个数组和链表的结合体 HashMap 基于 Hash 算法实现的 1 当我们向 HashMap 中 Put 元素时 利用 key 的 hashCode 重新计算出当前对象的 元素在数组中的下标 2 写入时 如果出现 Hash 值相同的 key 此时分类 如果 key 相同 则覆盖原始值 如果 key 不同 value 则放入链表中 3 读取时 直接找到 hash 值对应的下标 在进一步判断 key 是否相同 进而找到对 应值 JDK1.8 之前 JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashcode 经过扰动函数处理过后得到 hash 值然后通过 (n - 1) hash 判断当前元素存放的位置这里的 n 指的是数组的长度如果当前位置存在元素的话就判断该元素与要存入的元素的 hash 值以及 key 是否相同如果相同的话直接覆盖不相同就通过拉链法解决冲突。 所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞。 所谓 “拉链法” 就是将链表和数组相结合。也就是说创建一个链表数组数组中每一格就是一个链表。若遇到哈希冲突则将冲突的值加到链表中即可。 JDK1.8 之后 相比于之前的版本 JDK1.8 之后在解决哈希冲突时有了较大的变化当链表长度大于阈值默认为 8将链表转换成红黑树前会判断如果当前数组的长度小于 64那么会选择先进行数组扩容而不是转换为红黑树时将链表转化为红黑树以减少搜索时间。 20. ArrayList 和 LinkedList 的区别 重要 1 ArrayList 基于动态数据实现 LinkedList 基于链表实现 两者都是线程不安全的 2 ArrayList 基于数组 查询快 linkedList 基于链表 新增和删除更快 3 LinkedList 不支持高效的随机访问
http://www.zqtcl.cn/news/175333/

相关文章:

  • 如何做百度推广网站价格网如何查产品价格
  • 织梦移动网站后缀找生意项目
  • 深圳高端网站建设美工步骤图
  • 指数网站网站用ps下拉效果怎么做
  • 李沧网站建设电话从化企业网站建设
  • 北京电商网站建设公司新康家园网站建设
  • 广西注册公司网站企业高端网站制作
  • 国安中建建设集团网站南京网页设计培训班
  • 网站如何制作建设内容社交电商平台
  • 无法连接到wordpress站点网站建设两个方面
  • 广东官网网站建设品牌未来做啥网站能致富
  • 网站建设合同副本珠海微网站建设
  • wordpress 多语言 站点数据分析师报名入口
  • 做网站长尾词品牌设计模板
  • 企业建立网站的优势阿里云做网站号码
  • 江苏住房城乡建设厅网站一千块钱能注册公司吗
  • 山东兴华建设集团有限公司网站分类信息网站怎么做
  • 怎么用手机网站做软件西安网站建设开发熊掌号
  • asp.net做网站的流程杭州vi设计广告公司
  • 微信网站主题网络建设解决方案
  • 济南自助建站系统网站的外链建设计划
  • 中山低价网站建设一学一做教育视频网站有哪些内容
  • 网上最好的网站模块模板建站小程序
  • 安平县哪家做网站html动漫网站模板下载
  • 网站关于 模板wordpress adsence
  • 杭州公司网站建设如何选择五屏网站建设
  • 天津商城网站建设平面设计师网站
  • 上海的网站设计公司苏州网站建设渠道
  • 做美食没有广告的网站o2o网站建设
  • 网站程序调试模式怎么做做汽车特卖会的网站