一个线程调用两次start会怎么样 Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常. 谈谈线程的生命周期和状态转移 新建(NEW),表示线程被创建出来还没真正启动的状态,可以认为它是个Java内部状态. 就绪(RUNNABLE),表示该线程已经在JVM中执行,当然由于执行需要计算资源,它可能是正在运行,也可能还在等待系统分配给它CPU片段,在就绪队列里面排队. 在其他一些分析中,会额外区分一种状态RUNNING,但…
为什么ConcurrentHashMap是线程安全的 JDK1.7中,ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问. 那说说JDK1.7中Segment的原理 刚刚说的一段一段就是指Segment,它继承了ReentrantLock,具备锁和释放锁的功能.ConcurrentHashMap只有16个Segment,并且不会扩容,最多可以支持16个线程并发写. JDK…
synchronized怎么用的? 用过,synchronized是常用的并发控制关键字,简单的说就是访问加锁.它可以修饰静态方法或者一个类的class对象,这叫类锁:可以修饰普通方法或者代码块,这叫对象锁. synchronized是可重入锁吗? 从互斥锁的设计上来说,当一个线程试图操作一个由其他线程持有的对象锁的资源时,将会处于阻塞状态,但当一个线程再次请求自己持有对象锁的资源时,这种情况属于重入锁,请求将会成功.java中synchronized是基于原子性的内部锁机制,是可重入的. sy…
说说Atomiclnteger的使用场景 AtomicInteger提供原子操作来进行Integer的使用,适合并发情况下的使用,比如两个线程对同一个整数累加. 为什么Atomiclnteger是线程安全的,原理是什么 AtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于CAS(compare-and-swap)技术.CAS表现为一组指令,当利用CAS执行试图进行一些更新操作时,会首先比较当前数值,如果数值未变,代表没有其它线程进行并发修改,则…
HTTP状态码302的跳转逻辑 302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B. 302与301的区别和使用场景 301是永久重定向,而302是临时重定向.301适合做永久重定向: 302适合做临时的跳转. 301的定义:301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个…
TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量.它本质上是描述接收方的TCO数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据.这个窗口大小为0时,发送方将停止发送数据.启动定时器,等待这个窗口变成非0.   滑动窗口协议必须保证数据包的按序传输,发送窗口中的序列号代表已发送但尚未收到确认的数…
说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eureka.client.service-url.defaultZone: {address},address是其他节点的地址.如果是node1,address就是http://node2/eureka,http://node3/eureka,其他节点依次类推. 启动三个实例,注册信息会在他们之间互相同步.…
服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执行"top -Hp 进程号"命令:查看java进程下的所有线程占CPU的情况. 执行"printf "%x\n 10"命令 :后续查看线程堆栈信息展示的都是十六进制,为了找到咱们的线程堆栈信息,把线程号转成16进制.例如,printf "%x\n 1…
Dubbo应用为什么要部署Zookeeper? Zookeeper用来注册和发现服务,简单说就是提供端注册接口信息到Zookeeper,调用端在Zookeeper上查找接口对应的服务IP和端口.由于Zookeeper集群的高可用性,Dubbo推荐采用Zookeeper作为服务治理的基础组件. Zookeeper怎么做到高可用的? ZooKeeper集群解决了单点和容灾的问题,满足CAP理论中的CP特性,即一致性和分区容错性.ZooKeeper集群基于过半设计原则,至少有过半的机器保存了最新的数据…
1.想在运行时抛出异常,终止方法的运行 private final Set<Long> THREADS = new HashSet<>(); public void someMethod () { if (THREADS.contains(Thread.currentThread().getId())) { throw new RuntimeException("该线程不能再调用这个方法"); } THREADS.add(Thread.currentThread…
说说TCP三次握手的过程? 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认. 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态. 第三次握手:Client收到确认后,检查ack是否…
你们的项目为什么要用RabbitMQ? 消息队列的作用是系统解耦.同步改异步.请求消峰,举个下订单的例子: 前端获取用户订单信息,请求后端的订单创建接口.这个接口并不直接请求订单服务,而是首先生成唯一订单编号,再组装一个订单消息并发送给RabbitMQ,然后返回唯一订单编号给前端.前端会根据唯一订单编号轮询订单状态接口,如果订单创建成功,则拉起支付界面引导用户付款.作为消费者,订单服务收到订单消息后,开始检查参数.检查库存.生成订单等等核心业务流程. 解耦体现在订单创建接口并没有直接访问订单服务…
如何保证Redis高可用和高并发? Redis主从架构,一主多从,可以满足高可用和高并发.出现实例宕机自动进行主备切换,配置读写分离缓解Master读写压力. Redis高可用方案具体怎么实施? 使用官方推荐的哨兵(sentinel)机制就能实现,当主节点出现故障时,由Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性.它有四个主要功能: 集群监控,负责监控redis master和slave进程是否正常工作. 消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警…
Dubbo专题 (面试题+答案领取方式见侧边栏) 1.Dubbo 支持哪些协议,每种协议的应用场景,优缺点?2.Dubbo 超时时间怎样设置?3.Dubbo 有些哪些注册中心?4.Dubbo 集群的负载均衡有哪些策略5.Dubbo 是什么?6.Dubbo 的主要应用场景?7.Dubbo 的核心功能?8.Dubbo 的核心组件?9.Dubbo 服务注册与发现的流程?10.Dubbo 的架构设计?11.Dubbo 的服务调用流程?12.Dubbo 支持哪些协议,每种协议的应用场景,优缺点?13.du…
StringBuffer与StringBuild的区别 频繁修改字符串时,建议使用StringBuffer和StringBuilder类.StringBuilder相较于StringBuffer有速度优势,要求线程安全的情况下,必须使用StringBuffer类. 为什么拼接String不推荐用加号 String的值是不可变的,每次对String的操作都会生成新的String对象,不仅效率低下,而且消耗大量内存空间. 为什么String是不可变的 String类内部所有的字段都是final修饰的…
HashMap的put操作做了什么? HashMap的是由数组和链表构成的,JDK7之后加入了红黑树处理哈希冲突.put操作的步骤是这样的: 根据key值计算出哈希值作为数组下标.如果数组的这个位置是空的,把k放进去,put操作就完成了. 如果数组位置不为空,这个元素必然是个链表.遍历链表逐一比对value,如果value在链表中不存在,就把新建节点,将value放进去,put操作完成. 如果链表中value存在,则替换原节点的value,put操作完成. 如果链表节点数已经达到8个,首先判断当…
你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案? 我们采用的官方Redis Cluster方案.Codis是一整套缓存解决方案,采取的代理模式实现了高可用.数据分片.监控.动态扩态等功能,但是部署太复杂了.Cluster要简单很多,而且也基本满足目前的需要. Redis Cluster有什么缺点吗,或者说不适合什么场景? 这种模式将存储和元数据…
说说你们的分布式ID设计方案 我们采用Snowflake算法,生成一个64bit的数字,64bit被划分成多个段,分别表示时间戳.机器编码.序号. 41位的时间序列(精确到毫秒,41位的长度可以使用69年). 10位的机器标识(10位的长度最多支持部署1024个节点). 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号). 优点: 时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序. 性能高,每秒可生成几百万ID. 可以根据自身业务需求灵活调整bit位…
你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方式收集日志,通过kafaka发送出去. kafa存在丢消息的情况吗,怎么解决? producer把消息发送给broker,因为网络抖动,消息没有到达broker,且开发人员无感知. 解决方案:producer设置acks参数,消息同步到master之后返回ack信号,否则抛异常使应用程序感知到并在业…
Winform中的控件是绑定到特定的线程的(一般是主线程),这意味着从另一个线程更新主线程的控件不能直接调用该控件的成员. 控件绑定到特定的线程这个概念如下: 为了从另一个线程更新主线程的Windows Form控件,可用的方法有: 首先用一个简单的程序来示例,这个程序的功能是:在Winfrom窗体上,通过多线程用label显示时间.给出下面的两种实现方式 1.结合使用特定控件的如下成员 InvokeRequired属性:返回一个bool值,指示调用者在不同的线程上调用控件时是否必须使用Invo…
7. 线程安全 7.1 线程安全的定义 如果多线程下使用这个类,不过多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全的. 类的线程安全表现为: 操作的原子性 内存的可见性 不做正确的同步,在多个线程之间共享状态的时候,就会出现线程不安全. 7.2 如何保证线程安全 栈封闭 所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态. 比如下面的例子,a和b都是在方法内部定义的,无法被外部线程所访问,当方法结束后,栈内存被回收,所以是线程安全的. void fun(){ i…
[原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这些: 线程概念 线程基础操作 线程概念 进程代表了运行中的程序,一个运行的Java程序就是一个进程.在Java中,当我们启动main函数时就启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,称为主线程. 进程和线程的关系如下图所示: 由上图可以看出来,一个进程中有多个线程,多…
任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执行时间相对创建线程和销毁的时间较短 方法1: while (ture) { Socket connection = socket.accept(); handleTask(connection); //单线程处理所用任务 方法2: while (true) { final Socket connec…
免责声明:     本文内容多来自网络文章,转载为个人收藏,分享知识,如有侵权,请联系博主进行删除. 1.3.进程和线程 线程和进程的概念.并行和并发的概念 线程和进程: 线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位. 进程:是资源分配的基本单位.一个进程包括多个线程. 区别: 1.线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源. 2.每个进程都有自己一套独立的资源(数据),供其内的所有线程共享. 3.不论是大小,开销线程要更"轻量…
java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待).TERMINATED(终止.结束). 但是我发现大多数人的理解和上面的这六种还是有些差别,通常会加上阻塞状态,可运行状态,挂起状态. 这是Thread类描述线程状态的枚举类的源代码: public enum State { /** * Thread state for a thread which…
下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的Worker,线程池底层实现原理 6. 线程池工具类如Executors等 7. 如何停止一个线程(含代码),源码查看Thread.interrupted()和Thread.currentThread().isInterrupted()区别 8. 如何合理的配置 Java 线程池?如 CPU 密集型…
一.概述 “循环栅栏”.大概的意思就是一个可循环利用的屏障. CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier. 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程. CyclicBarrier可以使一定数量的线程…
并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 线程池的缘由 java中为了提高并发度,可以使用多线程共同执行,但是如果有大量线程短时间之内被创建和销毁,会占用大量的系统时间,影响系统效率. 为了解决上面的问题,java中引入了线程池,可以使创建好的线程在指定的时间内由系统统一管理,而不是在执行时创建,执行后就销毁,从而避免了频繁创建.销毁线程带来的系统开销. 线程池如何使用,以及实现原理,处理步骤,有什么使用注意事项等,今天主要从这几个方面详细介绍Java线程…
1.线程和进程的概念.并行和并发的概念 进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 线程:有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元.线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系…
c++调用python,底层就似乎fork一个子进程启动一个python的解释器,执行python文件,由于python解释器维护了一个内部状态,所以如果c++程序是多线程,每个线程都调用python,那么python就会报错,解决的方式就是在主线程中给python解释器加一个全局锁.当一个线程调用python的时候,别的线程等待.问题出现了整个c++如果逻辑都在python里面,那个c++的多线程就失去了意义. Py_Initialize() ; PyEval_InitThreads() ;…