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

小米手机如何做游戏视频网站/中国制造网外贸平台

小米手机如何做游戏视频网站,中国制造网外贸平台,营销技巧培训课程,有个网站经常换域名16.Synchronized关键字加在静态方法和实例方法的区别? 修饰静态方法,是对类进行加锁(Class对象),如果该类中有methodA和methodB都是被Synch修饰的静态方法,此时有两个线程T1、T2分别调用methodA()和methodB()&#x…

16.Synchronized关键字加在静态方法和实例方法的区别?

  • 修饰静态方法,是对类进行加锁(Class对象),如果该类中有methodA和methodB都是被Synch修饰的静态方法,此时有两个线程T1、T2分别调用methodA()和methodB(),则T2会阻塞等待直到T1执行完成之后才能执行。
  • 修饰实例方法时,是对实例进行加锁,锁信息在实例对象的对象头,如果调用同一个对象的两个不同的被Synch修饰的实例方法时,看到的效果和上面的一样,如果调用不同对象的两个不同的被Synch修饰的实例方法时,则不会阻塞。

17. CountDownLatch的用法?

  • 让主线程await,业务线程进行业务处理,处理完成时调用countDownLatch.countDown(),CountDownLatch实例化的时候需要根据业务去选择CountDownLatch的count。
  • 让业务线程await,主线程处理完数据之后进行countDownLatch.countDown(),此时业务线程被唤醒,然后去主线程拿数据,或者执行自己的业务逻辑。

18.解释一下volatile:

功能:

  • 保证线程可见性
  • 防止指令重排序

底层实现:

  • 可见性:
    • 被修饰的变量在被修改后可以立即同步到主内存,被修饰的变量在每次是用之前都从主内存刷新。JVM底层通过内存屏障来实现可见性。OS底层通过MESI(缓存一致性协议)。
    • 写内存屏障可以促使处理器将当前store buffer(存储缓存)的值写回主存。(先不记)
    • 读内存屏障可以促使处理器处理invalidate queue(失效队列),进而避免由于Store Buffer和Invalidate Queue的非实时性带来的问题。(先不记)
  • 禁止指令重排序:
    • 内存屏障来禁止指令重排序。
  • JMM内存屏障的策略:
    • 在每个volatile写操作的前面插入一个StoreStore屏障。
    • 在每个volatile写操作的后面插入一个StoreLoad屏障。
    • 在每个volatile读操作的前面插入一个LoadLoad屏障。
    • 在每个volatile读操作的后面插入一个LoadStore屏障。

使用场景(待完整总结,20231121):

根据经验总结,volatile最适合在一个线程写,其他线程读的场景。

19. 描述一下ThreadLocal的底层实现形式及实现的数据结构?

作用:

提供线程的局部变量,保证线程安全。使用不当会造成内存泄漏。

原理和数据结构:

  • ThreadLocal定义了ThreadLocalMap数据结构,它主要包含一个Entry类型的数组,Entry的keyThreadLocal本身(是弱引用),value为ThreadLocal对应添加的值。
  • 它通过key.threadLocalHashCode & (table.length – 1)确定数组索引位置,如果该位置的key不对,再通过nextIndex()计算下一个索引位置;它通过线性开放定址法减少hash冲突。
  • 每个线程(Thread类)都有一个ThreadLocalMap类型的threadLocals变量,存储这些局部变量(ThreadLocal对象)。

内存泄漏问题:

  • Entry的key是弱引用,在下一次GC后,就被回收了。此时,Map中存在key为null的Entry,ThreadLocal不会主动回收这些,可能会发生内存泄漏。
  • get、set、remove等方法都可以有清除key为null的Entry。

ThreadLocal碰撞解决与神奇的 0x61c88647:

  • 每次创建ThreadLocal实例时,哈希值都会累加 0x61c88647,目的是让哈希值能均匀的分布在2的N次方的数组里,减少碰撞。类似HashMap。

20. 线程池问题:

Executors提供了5种线程池:

  • newFixedThreadPool()(工作队列:LinkedBlockingQueue)
  • newCachedThreadPool()(工作队列: SynchronousQueue【同步移交队列,该队列没有缓冲区】、核心线程数为零、最大线程数为无限)
  • newSingleThreadExecutor()(工作队列:LinkedBlockingQueue)
  • newScheduledThreadPool()(工作队列:DelayedWorkQueue)
  • newSingleThreadScheduledExecutor()(工作队列:DelayedWorkQueue)

线程池参数:

  • int corePoolSize 线程池核心线程大小
  • int maximumPoolSize 线程池最大线程数量
  • long keepAliveTime 空闲线程存活时间
  • TimeUnit unit 空闲线程存活时间单位
  • BlockingQueue workQueue 工作队列
  • ThreadFactory threadFactory 线程工厂,主要用来创建线程(默认的工厂方法是:Executors.defaultThreadFactory()对线程进行安全检查并命名)
  • RejectedExecutionHandler handler 拒绝策略

4种拒绝策略:

当有界队列被填满后,拒绝策略(饱和策略)开始发挥作用。具体策略有:AbortPolicy中止策略(默认)、DiscardPolicy抛弃策略、DiscardOldestPolicy抛弃最旧的策略、CallerRunsPolicy调用者运行策略。

工作队列:

ArrayBlockingQueue、 LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue、DelayedWorkQueue。

线程池执行顺序:

  • 默认情况下,创建完线程池后并不会立即创建线程,而是等到有任务提交时才会创建线程来进行处理。
  • 当线程数小于核心线程数时,每提交一个任务就创建一个线程来执行(即便当前有线程处于空闲状态),直到当前线程数达到核心线程数。
  • ... ...
  • 如果某个线程的空闲时间超过了keepAliveTime,将被标记为可回收的,并且当前线程池的当前大小超过了核心线程数时,这个线程将被终止。

线程池原理(execute()举例):

  • ctl变量(AtomicInteger):高3位表示线程池的生命周期,底29位表示线程池的线程容量。
    • 生命周期:RUNNING -1、SHUTDOWN 0 、STOP 1、TIDYING 2、TERMINATED 3
  • Worker对象底层也用到了AQS。
  • 也用到了ReentrantLock锁 --> mainLock。
  • 面试前,源码过一遍。

任务结束后会不会回收线程?

不会回收线程,线程会重复利用。

我通过源码了解:

  • 在getTask()中,会循环获取队列中任务,直到队列为空并且当前有效线程数量大于核心线程数量或者其他条件时,会减去有效线程数,结束循环,返回null。
  • 在runWorker()中,循环调用getTask()获取任务执行,如果getTask()==null结束循环,最后finally模块会调用processWorkerExit()回收Worker即工作线程。
    • processWorkerExit()中,completedAbruptly为true时,即出现异常时,会减去有效线程数。
    • processWorkerExit()是会将当前Worker回收。 如果线程异常结束,不能满足最小需要的线程数,就会添加,调用addWorker()

21. 什么叫做阻塞队列的有界和无界,实际中有用过吗?

有界与无界的概念:

  • 有界队列:固定大小的队列
  • 无界队列:没有设置固定大小的队列

具体队列:

  • ArrayBlockingQueue:
    • 一个由数组结构组成的有界阻塞队列。
    • 一把锁(ReentrantLock),不支持读写同时操作。
    • 可以实现生产者消费者模型(put()+take()),底层使用同一个锁的两个condition。
  • LinkedBlockingQueue:
    • 一个由链表结构组成的无界阻塞队列。
    • 入队使用一把锁(ReentrantLock),出队使用一把锁,支持读写同时操作。
    • 可以实现生产者消费者模型(put()+take()),底层使用两个锁的condition。
  • PriorityBlockingQueue:
    • 一个支持优先级排序的无界阻塞队列。
    • 大堆、小堆,实现compareTo。
  • DelayQueue:
    • 一个使用优先级队列实现的无界阻塞队列,可以实现精确的定时任务。
  • SynchronousQueue:
    • 一个不存储元素的阻塞队列。
  • LinkedTransferQueue:
    • 一个由链表结构组成的无界阻塞队列。
    • 它是LinkedBolckingQueue和SynchronousQueue的合体。生产者会一直阻塞,直到所添加到队列的元素被某一个消费者所消费。
  • LinkedBlockingDeque:
    • 一个由链表结构组成的双向无界阻塞队列。
    • 可以用在“工作窃取”模式中 -> ForkJoinPool。

22. 如何在方法栈中进行数据传递?

  • 通过方法参数传递。
  • 通过共享变量。
  • 如果在用一个线程中,还可以使用ThreadLocal进行传递。

23. 描述一下AQS?****

简介(AbstractQueuedSynchronizer):

AQS是一个用于构建锁和同步器的框架。它是除了java自带的synchronized关键字之外的锁机制。例如ReentrantLock、ReentrantReadWriteLock、Semaphore、FutureTask等都是基于AQS实现的。

状态变量state:

AQS中定义了一个状态变量state,特点:volatile变量修饰,CAS方式更新。

它的两种使用方法:(拓展时说)

  • 互斥锁:
    • 当AQS只实现为互斥锁的时候,每次只要原子更新state的值从0变为1成功了就获取了锁,可重入是通过不断把state原子更新加1实现的。
  • 互斥锁 + 共享锁:
    • 当AQS需要同时实现为互斥锁+共享锁的时候,低16位存储互斥锁的状态,高16位存储共享锁的状态,主要用于实现读写锁。

AQS队列(CLH队列):

是一个FIFO的双向队列,AQS依赖它来完成同步状态的管理,CLH队列包含多个Node对象,每个节点表示一个线程,它保存着线程的引用(thread)、状态(waitStatus)、前驱节点(prev)、后继节点(next)、条件队列中的后继节点(nextWaiter)。

获取锁失败(非tryLock())的线程都将进入这个队列中排队,等待锁释放后唤醒下一个排队的线程(互斥锁模式下)。

AQS队列的头结点不为空,头结点是加锁成功的节点,在设置成头节点后,会将该节点的线程设置为null。

waitStatus值:CANCELLED= 1、SIGNAL=-1、CONDITION=-2、PROPAGATE=-

Condition队列:

内部类ConditionObject,它实现了Condition接口,主要用于实现条件锁。

ConditionObject中也维护了一个队列,这个队列主要用于等待条件的成立,当条件成立时,这个队列中的元素将其移动到AQS的队列中,等待占有锁的线程释放锁后被唤醒。

Condition典型的运用场景:在BlockingQueue中的实现,当队列为空时,获取元素的线程阻塞在notEmpty条件上,一旦队列中添加了一个元素,将通知notEmpty条件,可从阻塞队列中获取元素。

模板方法:

AQS里面定义了一系列的模板方法,我们只需重新部分钩子方法就可以,比如下面这些:

  • isHeldExclusively():该线程是否正在独占资源(只有用到condition需实现)。
  • tryAcquire(int):独占方式,尝试获取资源。成功true,失败false。
  • tryRelease(int):独占方式,尝试释放资源。成功true,失败false。
  • ... ...

常用的方法:

  • acquire(int):独占模式的获取,忽略中断。
  • acquireInterruptibly(int):独占模式的获取,可中断
  • release(int):独占模式的释放。
  • ... ...

源码:

面试前,源码过一遍,这个简单过一下,感觉没啥问的。

24. 简要描述一下ConcurrentHashMap底层原理?

JDK1.7:

  • 分段锁:内部主要是一个Segment数组,而数组的每一项又是一个HashEntry数组,元素都存在HashEntry数组里。因为每次锁定的是Segment对象,也就是整个HashEntry数组,所以又叫分段锁。
  • 计算Segment数组位置:

  • ConcurrentHashMap默认长度是16,即有16个Segment,最大支持16个线程并发。

JDK1.8:*****

  • ConcurrentHashMap舍弃了分段锁的实现方式,利用CAS + synchronized + volatile(关键变量,例如table、nextTable、sizeCtl)来保证并发更新的安全。
  • 底层数据结构:数组+链表+红黑树来实现。
  • 重要成员变量:
    • table:默认为null,初始化发生在第一次插入操作,用来存储Node节点数据。
    • nextTable:默认为null,扩容时新生成的数组,其大小为原数组的两倍。
    • sizeCtl :默认为0,用来控制table的初始化和扩容操作。
      • 1:代表table正在初始化
      • N:表示有N-1个线程正在进行扩容操作
    • Node:保存key,value及key的hash值的数据结构(其中value和next都用volatile修饰)。
  • put过程简述:
    • put操作采用CAS+synchronized实现并发插入或更新操作:
      • 当前bucket为空时,使用CAS操作,将Node放入对应的bucket中。
      • 出现hash冲突,则采用synchronized关键字。
        • 倘若当前hash对应的节点是链表的头节点,遍历链表,若找到对应的node节点,则修改node节点的值,否则在链表末尾添加node节点;
        • 倘若当前节点是红黑树的根节点,在树结构上遍历元素,更新或增加节点。
      • 倘若当前map正在扩容(f.hash == MOVED),先协助扩容,在更新值。

ConcurrentHashMap 不允许key value 为空。 -> null 是特殊值,充当了所有非标量归约运算的隐式基础。

相关文章:

Java多线程面试重点-2

16.Synchronized关键字加在静态方法和实例方法的区别? 修饰静态方法,是对类进行加锁(Class对象),如果该类中有methodA和methodB都是被Synch修饰的静态方法,此时有两个线程T1、T2分别调用methodA()和methodB()&#x…...

LLaMA Factory多卡微调的实战教程(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

IOUtils的妙用

查看IOUtils的api文档,它的方法大部分都是重载的,方法的用法总结如下: 方法名使用说明buffer将传入的流进行包装,变成缓冲流。并可以通过参数指定缓冲大小closeQueitly关闭流contentEquals比较两个流中的内容的是否一致copy将输入…...

目标检测——室内服务机器人LifelongSLAM数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …...

Mysql学习笔记-进阶篇

一、存储引擎 1、MYSQL体系结构 连接层、服务层、引擎层、存储层; 2、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是库的,所以存储引擎也可被称为表类型。 1)在创…...

AI写真:ControlNet 之 InstantID

但是 IPAdapter-FaceId 目前只在 SD 1.5 模型上表现较好,SDXL 模型上的表现较差,不能用于实际生产。可是很多同学已经在使用SDXL了,而且SDXL确实整体上出图效果更好,怎么办? 这篇文章就来给大家介绍一个在SDXL中创作A…...

单元测试的思考与实践

1. 什么是单元测试 通常来说单元测试,是一种自动化测试,同时包含一下特性: 验证很小的一段代码(业务意义 或者 代码逻辑 上不可再分割的单元),能够更准确的定位到问题代码的位置 能够快速运行(…...

C# Socket通讯简单Demo

C# Socket通讯简单Demo Client端Listener端 Client端 static void Main(string[] args) {XSocketService XSocketService new XSocketService();XSocketService.Init();while (true){Console.Write("请输入消息:");var msg Console.ReadLine();XSocket…...

视频融合共享平台LntonCVS视频监控管理平台技术方案详细介绍

LntonCVS国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲…...

C#ListView的单元格支持添加基本及自定义任意控件

功能说明 使用ListView时,希望可以在单元格显示图片或其他控件,发现原生的ListView不支持,于是通过拓展,实现ListView可以显示任意控件的功能,效果如下: 实现方法 本来想着在单元格里面实现控件的自绘的…...

数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践

随着企业业务的不断发展,数据量往往呈现出快速的增长趋势。使用MySQL的用户面对这种增长,普遍选择采用分库分表技术作为应对方案。然而,这一方案常在后期会遇到很多痛点。 分库分表的痛点 痛点 1:难以保证数据一致性。由于分库分…...

3个火火火的AI项目,开源了!

友友们,今天我要给你们安利三个超酷的开源项目,它们都和AI有关,而且每一个都能让你的日常生活变得更加有趣和便捷!(最近AI绘图又又超神了,分享以下美图养眼) 01 字节出品,文字转语音Seed-TTS 字节推出了一…...

算法 | 子集数排列树满m叉树二分搜索归并排序快速排序

子集树:O(2^n) 一个序列的所有子集为2^n,即可看成具有2^n个叶节点的满二叉树 int backtrack(int k) //k表示扩展结点在解空间树中所处的层次 {if(k>n) //n标识问题的规模output(x); //x是存放当前解的一维数组if(constraint(k)…...

SpringBoot配置第三方专业缓存技术jetcache方法缓存方案

jetcache方法缓存 我们可以给每个方法配置缓存方案 JetCache 是一个基于 Java 的缓存库,支持多种缓存方案和缓存策略,主要用于提升应用程序的性能和响应速度。它提供了多种缓存模式和特性,可以根据需求选择合适的缓存方案。 JetCache 的主…...

游戏开发丨基于PyGame的消消乐小游戏

文章目录 写在前面PyGame消消乐注意事项系列文章写在后面 写在前面 本期内容:基于pygame实现喜羊羊与灰太狼版消消乐小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700193 实验环境 python3.11及以上pycharmpygame 安装pygame…...

软件项目管理概述

1.什么是项目? 2.项目管理的定义 3.项目管理的本质 4.项目成功的标志 5.项目管理的基本方法 6.项目的生命周期(启动 计划 执行 控制 结束) 7.结合生活中的某件事,谈谈项目管理的作用 项目管理在日常生活中扮演着重要的角色&…...

FastAdmin后台开发框架 lang 任意文件读取漏洞复现

0x01 产品简介 FastAdmin是一款基于PHPBootstrap的开源后台框架,专为开发者精心打造。它基于ThinkPHP和Bootstrap两大主流技术构建,拥有完善的权限管理系统和一键生成CRUD等强大功能。FastAdmin致力于提高开发效率,降低开发成本,…...

数字时代PLM系统的重要性

什么是 PLM(产品生命周期管理)? 从最基本的层面上讲,产品生命周期管理 (PLM)是管理产品从最初构思、开发、服务和处置的整个过程的战略流程。换句话说,PLM 意味着管理产品从诞生到消亡所涉及的一切。 什么是 PLM 软件…...

安卓实现圆形按钮轮廓以及解决无法更改按钮颜色的问题

1.实现按钮轮廓 在drawable文件新建xml文件 <shape xmlns:android"http://schemas.android.com/apk/res/android"<!--实现圆形-->android:shape"oval"><!--指定内部的填充色--><solid android:color"#FFFFFF"/><!-…...

常用原语介绍

1.在Xilinx的example&#xff08;wavegen example&#xff09;中看到他们的顶层模块的输入输出管脚都手动例化原语IBUF以及OBUF——工具也会自动给我们加上不必要自己加 2.非mrcc个srcc的管脚输入的时钟信号&#xff0c;无法进入mmcm和bufg————试验过会报错 3.实际上&…...

29. 透镜阵列

导论&#xff1a; 物理传播光学&#xff08;POP&#xff09;不仅可以用于简单系统&#xff0c;也可以设计优化复杂的光学系统&#xff0c;比如透镜阵列。 设计流程&#xff1a; 透镜阵列建模 在孔径类型中选择“入瞳直径”&#xff0c;并输入2 在视场设定中。设置一个视场&…...

深入理解并打败C语言难关之一————指针(3)

前言&#xff1a; 昨天把指针最为基础的内容讲完了&#xff0c;并且详细说明了传值调用和传址调用的区别&#xff08;这次我也是做到了每日一更&#xff0c;感觉有好多想写的但是没有写完&#xff09;&#xff0c;下面不多废话&#xff0c;下面进入本文想要说的内容 目录&#…...

Ubuntu-24.04-live-server-amd64启用ssh

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu安装qemu-guest-agent Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、输入安装命令二、使用私钥登录&#xff08;可选&#xff09;1.创建私钥2.生成三个文件说明3.将公钥复制到服务器 三…...

Leetcode 2786. 访问数组中的位置使分数最大(DP 优化)

Leetcode 2786. 访问数组中的位置使分数最大 DP 以每个位置为结尾的序列的分数取决于前方的分数&#xff0c;根据奇偶性计算&#xff0c;取最大值 超时 class Solution {public long maxScore(int[] nums, int x) {int n nums.length;long dp[] new long[n];Arrays.fill(dp…...

【docker实战】使用Dockerfile的COPY拷贝资源遇到的问题

事情是这样的。 在我负责的golang项目中&#xff0c;使用硬代码验证某块逻辑。比如&#xff1a; 于是&#xff0c;为了解决硬代码的问题&#xff0c;我制作了表格工具&#xff1a;【开源项目】Excel数据表自动生成工具v1.0版 – 经云的清净小站 (skycreator.top)。 使用表格工…...

如何用多线程执行 unittest 测试用例实现方案

前言 使用python做过自动化测试的小伙伴&#xff0c;想必都知道unittest和pytest这两个单元测试框架&#xff0c;其中unittest是python的官方库&#xff0c;功能相对于pytest来要逊色不少&#xff0c;但是uniitest使用上手简单&#xff0c;也受到的很多的小伙伴喜爱。一直以来都…...

Ascend310 EP模式下容器内进行推理测试

EP模式下容器内进行推理测试 本文的软硬件环境如下&#xff1a; 机器&#xff1a;x86台式机一台 OS&#xff1a; 5.4.0-26-generic Ubuntu20.04 LTS 推理卡&#xff1a;DLAP200-HP-2&#xff08;凌华基于atlas200模块打造的两模块推理卡&#xff09; 1. 推理卡固件和驱动安…...

(el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程

Ⅰ、Element-plus 提供的Select选择器组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供Select组件情况&#xff1a; 其一、Element-ui 自提供的Select代码情况为(示例的代码)&#xff1a; // Element-plus 提供的组件代码: <template><div class"f…...

Java基础之Math与Array类与System

文章目录 一、Math.random&#xff08;&#xff09;二、Arrays.binarySearch()三、asList&#xff08;&#xff09;四、System tip&#xff1a;以下是正文部分 一、Math.random&#xff08;&#xff09; a < num < b int num (int)(Math.random() * (b - a 1)) a二、…...

警告:Hydration attribute mismatch on Note: this mismatch is check-only.(水合不匹配)

vue3Nuxt3运行代码是提示如下警告 [Vue warn]: Hydration attribute mismatch on <ul id​"sub_menu_5_$$_sub1-popup" class​"ant-menu ant-menu-sub ant-menu-inline" data-menu-list​"true" style​"display:​none;​">​…...