
java基础
文章平均质量分 68
佐杰
这个作者很懒,什么都没留下…
展开
-
动手实现一个可发送短信随机密码的高安全性用户密码系统
现假设我们是某个社交网站,对于每个新来的用户,我们可能都需要注册之后,才能进行使用网站的功能,但是对于注册流程,可能每个网站的流程都不一样,假设我们社交网站的注册流程为,先填写用户名和手机号,点击注册之后,系统注册成功之后,会创建一个随机密码,通过短信发送给用户,以后用户可以用该密码进行登录,也可以自己修改密码,我们来看一下整体的业务流程图。通过ThreadLocal来实现高安全性用户密码系统发送随机密码案例。用一个异步方式去处理随机密码的生成和随机密码短信的下发的任务,请看下图。原创 2024-06-25 20:55:32 · 1035 阅读 · 0 评论 -
线程本地化存储如何保证线程安全
我们把代码还原到图中,int c = a + b,基本类型的局部变量是存在栈空间,而new Object()代码创建的的对象实例的确是存在虚拟机的堆空间里,但是Object object只是引用(reference)堆空间里的对象,重要的事情说三遍,是引用,是引用,是引用,而new Object()这个对象只有被当前线程的自己所引用,我们再来看下面这张图。因为变量不共享,就不存在线程安全问题。当方法返回的时候,方法对应的栈帧,也会在栈空间被弹出,同时,执行的方法和对应的栈帧是同生共死的关系。原创 2024-06-18 13:57:43 · 900 阅读 · 0 评论 -
探秘提交任务到线程池后源码的执行流程
7]如果说线程池状态确实是RUNNING,也就是二次校验通过,那么就判断一下线程池里是否还有线程,通过WorkerCountOf(recheck) == 0来判断,如果返回true了,就说明当前线程池中是空的,没有线程。对于核心线程来说,他们可以无限制的等待着任务被获取并执行,而非核心的线程则是在有限的时间内获取任务,一旦Worker无法获取到任务,也就是要获取的任务为空,循环就会结束,Worker自己就会主动的去除掉在线程池中的应用,进而被回收掉并退出。这个方法实际上最终就是开启了新的线程去执行任务。原创 2024-06-17 17:16:14 · 994 阅读 · 0 评论 -
分析线程池的构造过程,追踪核心成员变量
这部分线程给他们分配了一个keepAliveTime参数,意义在于,当没有可处理的任务时,让它们别急着回收,而是先等会儿,看有没有任务来了,如果有就去执行任务,否则就等达到了keepAliveTime之后,对工作线程进行回收。也就是上图中的“最大池maximumPool”的容量,它的作用在于,当核心线程数被任务占满,且其中的任务缓冲队列也满了的时候,让新提交的任务仍旧可以执行,不至于立马就被拒绝。如下图中的核心池Pool中的线程池的数量,代表的含义就是这里的corePoolSize,如图。原创 2024-06-17 16:52:50 · 924 阅读 · 0 评论 -
如何避免重复创建线程?创建线程池的方式有哪些?各自优缺点有哪些?
这里还要强调的一点是,在Java语言中,当我们每创建一个线程的时候,Java虚拟机就会在JVM内存中创建出一个Thread对象,与此同时创建一个操作系统的线程,最终在系统底层映射的是操作系统的本地线程(Native Thread),在windows系统中是1对1映射(即一个Java线程映射一个操作系统线程),在Linux系统是N对M映射(即多个Java线程映射多个操作系统线程,N与M不完全相等),这里就仅做了解,不详细展开了,感兴趣的同学可以去看一下操作系统的线程部分的知识。这玩意儿也是要占用内存空间的。原创 2024-06-16 11:12:46 · 1201 阅读 · 0 评论 -
实现智能安防系统的报警功能(一)
这些产品都需要报警功能,一旦监察到异常,就会向报警中心服务器上传报警信息,然后由报警中心程序通知对应的人员或者系统进行处理。建立定时器,并每隔5秒发送一次心跳检查,如果与告警中心服务器的连接断开,则重新建立连接。HeartbeatTask()心跳检查,新建定时调度线程,每隔n秒去检查一次连接。init: 初始化报警服务,和报警服务器建立连接,并定时发送心跳信息。通过blocker去唤醒一个线程,与告警中心服务器建立连接。4、烟雾报警器、燃气探测器。3、门磁、人体探测器。原创 2024-06-16 10:17:37 · 381 阅读 · 0 评论 -
如何解决百万交易系统转账过程中循环等待,性能太差的问题?
死锁” 是两个或两个以上的线程在执行过程中,互相持有对方所需要的资源,导致这些线程处于等待状态,无法继续执行。若无外力作用,它们都将无法推进下去,就进入了“永久”阻塞的状态。如上图所示:线程01获得了账户A的锁,且同时去尝试获取账户B的锁;但是,线程02已经获得了账户B的锁,所以,线程01只能等待。同样,线程02也无法获得账户A的锁(已被线程01获取),只能等待。于是,线程01和线程02都在等待对方持有的锁,且会无限期的等待下去,这就是我们所说的“死锁”了!原创 2024-06-15 21:29:11 · 894 阅读 · 0 评论 -
线程在执行过程中的状态是如何流转的?
当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。线程一旦终止了,就不能复生。所以,当这个线程要执行时,就必须调用这个对象的start()方法,将NEW 状态转换到 RUNNABLE 状态。线程执行完 run() 方法后,会自动转换到 TERMINATED 状态,当然如果执行 run() 方法的时候异常抛出,也会导致线程终止。我们为了验证线程run()后,会自动转到terminated状态,所以,使用thread.getState()方法来获取“线程状态”。原创 2024-06-15 20:57:06 · 809 阅读 · 0 评论 -
使用无界队列的线程池,在远程服务异常的情况下导致内存飙升怎么办?
只要有一个Worker异常挂掉,此时就会把这个worker从线程池里给挪出去,然后判断一下,如果当前线程数量 < corePoolSize,就会重新创建一个Worker和线程放入线程池中,自己再搞一个补位。可以考虑自己定制线程池,使用有界队列,不要使用无界队列,可以限制内存空间的使用,避免系统崩溃;无界队列,直接支撑前端的请求,不允许有界阻塞,到最后大不了就是系统崩溃。如果你提交到线程池的任务报错了,抛了异常出来,在线程池执行的过程中,Worker层面接收到一个异常,会直接throw抛出去。原创 2024-05-23 18:25:45 · 319 阅读 · 0 评论 -
死锁定位与解决方案
1.源码如下package cn.haochen.locak;/** * @author haochen * desc:死锁模拟程序 */public class DeadLockDemo { public static void main(String[] args) { DeadLock d1=new DeadLock(true); DeadLock d2=new DeadLock(false); Thread t1=new Thre原创 2021-01-28 18:03:20 · 228 阅读 · 0 评论 -
在实际的使用中,应该如何合理配置核心线程数和队列长度呢?
在实际的使用中,应该如何合理配置核心线程数和队列长度呢?一个正常的请求有cpu执行时间(比如代码中进行数据的封装和计算等)和等待时间(比如调用dubbo接口等待io的响应结果或者其他等待io的过程中是不占用cpu时间的);核心线程数=cpu核数*(执行时间/(执行时间+等待时间))...原创 2021-03-02 19:48:00 · 338 阅读 · 0 评论 -
cpu多级缓存并发架构解析
原创 2020-11-19 10:39:30 · 286 阅读 · 0 评论 -
多线程的三个特性:原子性、可见性、有序性
原子性:是指一个操作是不可中断的。即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。比如,对于一个静态全局变量int i,两个线程同时对它赋值,线程A给他赋值为1,线程B给他赋值为-1。那么不管这两个线程以何种方式。何种步调工作,i的值要么是1,要么是-1.线程A和线程B之间是没有干扰的。这就是原子性的一个特点,不可被中断。可见性:是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。显然,对于串行来说,可见性问题是不存在的。有序性:在并发时,程序的执行可能会原创 2021-05-11 23:14:42 · 1105 阅读 · 0 评论 -
类的信息包含哪些信息
1.类的class对象 也就是类的入口信息2.类中的方法3.static修饰的静态变量和常量4.类的全路径```原创 2020-12-18 10:56:47 · 1262 阅读 · 0 评论 -
java集合之Connection和connections的区别
区别在于: Connection是单列集合的根接口Connections是集合的工具类原创 2020-09-23 22:26:24 · 2014 阅读 · 0 评论 -
自定义注解
自定义注解一、注解是什么?二、使用步骤1.使用关键字@interface@Target @Retention详解一、注解是什么? 我们在代码中经常看到@Override @@SuppressWarnings() 等等就是注解特别在spring编程中看到大量的注解。二、使用步骤1.使用关键字@interface代码如下(示例):/** * 自定义注解 */public class Test02 { @MyAnnotation2() public void test(){原创 2020-08-26 21:35:00 · 200 阅读 · 0 评论 -
hashmap中寻址算法为什么用&运算不用%运算
hashmap中寻址算法为什么用&运算不用%运算理由:从计算机层面&运算的效率更高原创 2020-08-16 23:41:44 · 628 阅读 · 0 评论 -
快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么?
描述java.util包下面的所有集合类都是快速失败的,而Java.util.concurent包下面的集合类都是安全失败。快速失败 迭代器会抛出ConcurentModificationException异常,而安全失败的迭代器永远 不会抛出这样的异常快速失败(fail-fast)public class FailFastDemo { public static void main(String[] args) { HashMap hashMap = new HashMap原创 2020-07-01 22:58:18 · 391 阅读 · 0 评论 -
== 与 equals的区别
== 与 equals== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。PS:基本数据类型比较的是值,引用数据类型比较的是内存地址equals() : 它的作用也是判断两个对象是否相等但它一般有两种使用情况: 情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个 对象时,等价于通过“==”比较这两个对象。public ...原创 2019-11-20 15:21:33 · 140 阅读 · 0 评论 -
String StringBuffer 和 StringBuilder 的区别 是什么 String 为什么是不可变的
String StringBuffer 和 StringBuilder 的区别 是什么 String 为什么是不可变的可变性线程安全性性能对于三者使用的总结:可变性简单来说 Spring 类中使用了final关键字 字符数组保存字符串 private final char value[],所以String对象是不可变的。而StringBuild和Springbuffer都继承AbstractS...原创 2019-11-20 14:31:01 · 252 阅读 · 0 评论 -
TCP的三次握手
传输控制协议TCP简介1.面向连接的,可靠的,基于字节流的传输层通信协议2.将应用层的数据流分割成报文段并发送给目标节点的TCP层3.数据包都有序号,对方收到则发送ACK确认,未收到则重传4.使用校验来检验数据在传输过程中是否有误TCP Flags URG:紧急指针标志ACK:确认序号标志PSH:push标志RST:重置连接标志SYN:同步序号,用于建立连接...原创 2019-02-25 22:45:55 · 333 阅读 · 0 评论 -
java基础考点
原创 2019-02-20 21:01:54 · 253 阅读 · 0 评论 -
多线程(一)什么是线程和进程
说起线程和进程 这里就要说下应用程序 什么是应用程序?应用程序就是可执行的软件 比如说QQ office .exe .bat文件都可以叫做应用程序在一个应用程序中都会有个进程什么是进程?1.进程中有多个不同的执行路径,多个线程的集合。2.进程是执行中的程序3.一个操作系统可以有多个进程总结:进程就是正在运行的程序,是线程的集合。在进程中程序代码是怎么执行的,代码...原创 2019-03-05 22:03:05 · 209 阅读 · 0 评论 -
多线程(二)为什么要使用多线程?
为什么要使用多线程?这里举个例子:在用百度云时(只能单线程运行的情况)在使用百度云时(可以多线程的运行情况)总结:使用多线程可以提高程序的效率...原创 2019-03-05 22:37:40 · 237 阅读 · 0 评论 -
TCP简单demo
客户端:package com.yfy.net;import java.io.BufferedWriter;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;public class TCPClient {...原创 2019-02-26 21:31:47 · 1029 阅读 · 0 评论 -
多线程(六)守护线程和非守护线程
什么是守护线程?什么是非守护线程?守护线程是和main有关的用户线程,用户自己创建的线程,用户创建线程,如果主线程停止掉,不会影响用户线程。用户线程也叫非守护线程守护线程的特征:守护线程和主线程一起销毁非守护线程的特征:非守护线程和守护线程互不影响非守护线程Demopackage com.zuojie;/** * 用户线程 是主线程创建的线程 非守护线程 ...原创 2019-03-13 23:55:39 · 313 阅读 · 0 评论 -
多线程(三)使用继承的方式创建线程
使用继承Thread的方式来创建线程创建线程调用线程 这里要说明一下启动线程要通用start方法线程运行的结果这里延伸的说明一下同步和异步(从下面这张图可以看到同步通俗的理解就是代码从上往下执行属于单线程的执行方式 异步是有多条执行路径 互不干扰 有多条执行方式 属于多线程的执行方式)源码下载:https://github.com/issueDriver/bas...原创 2019-03-07 00:34:37 · 596 阅读 · 1 评论 -
多线程(七)多线程的几种状态
线程的几种状态 新建 准备 运行 休眠 停止原创 2019-03-14 21:56:34 · 515 阅读 · 0 评论 -
多线程(五)使用匿名内部类创建线程
直接上代码package com.zuojie;/** * 功能描述(使用匿名内部类创建线程) * @author zuojie * */public class ThreadDemo03 { public static void main(String[] args) { //什么是匿名内部类 Thread t1 = new Thread(new Runnable(...原创 2019-03-10 21:42:13 · 408 阅读 · 0 评论 -
多线程(四)使用实现Runnable的方式来创建线程
创建线程调用线程执行结果补充说明 创建线程是使用继成Thread的方式还是通过实现Runnabe的方式好?我们在一般开发都是面向接口编程 并且通过接口可是实现多继承 这里采用实现Runnale的方式好源码地址https://github.com/issueDriver/basics/tree/master/demos/Thread_demo01...原创 2019-03-08 00:12:39 · 618 阅读 · 0 评论 -
多线程(十)使用多线程分批处理信息
需求分析:现在银行有一批10万的用户,需要给每个用户发一条短信 应该怎么做?假如每条短信的发送时间是1秒 使用单线程 就是10万秒 这时候我们可以用多线程分批处理。代码实现步骤如下:代码如下:实体类package org.Thread_batch.pojo;/** * 功能描述(用户的实体类) * @author zuojie * */public clas...原创 2019-03-19 23:42:37 · 1696 阅读 · 0 评论 -
多线程(八)join的用法
描述:此时有两个线程 一个线程A 一个线程B,A线程调用了B的join方法作用:A等待B线程执行完毕之后(释放我的CPU执行权),再继续执行。线程正常执行的顺序package com.zuojie;/** * 线程中join的用法 * * @author zuojie * */public class ThreadDemo06 { public static ...原创 2019-03-17 23:19:35 · 209 阅读 · 0 评论 -
多线程(九)jion实战demo
需求描述:现在有T1,T2,T3三个线程,你怎么样保证T2在T1执行完毕后执行,T2在T3执行完后执行Demo如下(这里要注意的是在调用匿名内部类的时候在调用要用final修饰)package com.zuojie;/** * xu * * @author zuojie * */public class ThreadDemo07 { public static v...原创 2019-03-18 22:13:51 · 323 阅读 · 1 评论 -
多线程(十一)线程安全介绍
什么是线程安全问题?当多线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据数据冲突问题。但是做读的操作时是不会发生数据冲突问题需求如下:100张车票 ,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。package com.zuojie;/** * @author:zuojie */public class ThreadTrain implements...原创 2019-04-09 23:42:45 · 175 阅读 · 0 评论 -
多线程(十一)多线程死锁
多线程死锁什么是多线程死锁代码如下功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入什么是多线程死锁数据库死锁,线程死...原创 2019-05-13 22:00:50 · 139 阅读 · 0 评论 -
多线程(十二)线程是如何通信的?
什么是线程之前的通信?多线程之前的通信,其实就是多个线程在操作同一个资源,但是操作动作不同如图所示多线程之间通讯需求需求如下:第一个线程写入(input)用户,另一个线程读取(out)用户,实现读一个,写一个操作。源码如下:源码中包含着线程安全的解决方法 wait和notify的用法package com.zuojie;/** * 共享资源 * @author zuojie ...原创 2019-05-14 22:39:03 · 1163 阅读 · 0 评论 -
Java的跨平台原理
Java的跨平台原理如图所示:由于操作系统(windows,linux)等支持指令集,不是完全一致的,就会让我们的程序在不同的操作系统中要执行不同的程序代码,java开发了适用于不同操作系统及位数的java虚拟机来屏蔽各系统之间的差异,提供统一的接口,对于我们Java开发者而言,你只需要在不同的系统上安装对应的不同的java虚拟机,这时你的java程序只需要遵循java规范就可以在所有的操...原创 2019-01-21 15:08:52 · 233 阅读 · 2 评论