- 博客(36)
- 收藏
- 关注
原创 7-30小记
第十四讲:Semaphore(信号量)含义 类似生活中红绿灯,红灯停,绿灯行;线程能不能执行,需要看信号量是否允许;信号量模型 1)一个计数器,一个等待队列,三个方法; 2)在模型中,计数器与等待队列是透明的,可以通过init()、up()、down()方法访问; 3)init():设置计数器初始值; up():计数器值+1, ...
2020-07-30 08:47:36 144
原创 7-16小记
第十三讲:Condition背景 1)Condition实现l了管程模型里面的条件变量; 2)Java语言内置管程只有一个条件变量,而Lock&Condition实现的管程是支持多个条件变量的; 3)大多并发场景下,支持多个条件变量让并发程序可读性更强,实现更容易; 比如,实现一个阻塞队列,就需要两个条件变量; ...
2020-07-17 08:27:15 152
原创 7-15小记
第十二讲:Lock&Condition引出问题 并发编程领域,两大核心问题,一个是互斥,同一时刻只允许一个线程访问共享资源, 另一个是同步,即线程之间如何通信,协作; Java SDK并发包通过Lock和Condition两个接口实现管程,其中Lock用于解决互斥问 题,Condition用于解决同步问题;优势一:对于死锁问题,提出破坏不可抢占条件方案1)能够响应中断:阻塞的线程响应中断信号,释放持有锁;2)支持超...
2020-07-15 23:46:54 155
原创 7-10小记
第十一讲:为什么局部变量是线程安全的?方法是如何被执行的 1)第一行,声明一个int变量a;第二行,调用方法fibonacci(a);第三行,将b赋值给c; 2)当调用fibonacci(a)时,CPU要先找到方法地址(0277),然后跳转到地址去执行 代码,最后执行完方法后,要能够返回(0132); 方法与调用栈 1)假如有A、B、C三个方法,调用关系是A->B->...
2020-07-10 21:18:46 152
原创 7-9小记
第十讲:创建多少线程才是合适的?引出问题 在Java领域,实现并发程序的主要手段是多线程,使用多线程是简单的,但是使用多少个线程却是个难题?为什么要使用多线程 本质就是提升程序性能,这个是比较笼统的概念,如何度量性能?核心标准:延迟、吞吐量; 延迟:发出请求到收到响应这个过程的时间(时间维度); 吞吐量:单位时间内能处理请求的数量(空间维度); 同等条件下,延迟越短,吞吐量越大;所谓提升性能,就是降低延迟,提高吞吐...
2020-07-09 22:28:05 178
原创 7-8小记
第九讲-java线程的生命周期通用线程生命周期 1)初始状态: 编程语言层面,线程已经被创建;操作系统层面,线程还没有创建;不允许分配CPU执行; 2)可运行状态: 操作系统层面,线程已经被创建;允许分配CPU执行; 3)运行状态: 可运行状态(被分配空闲CPU) -> 运行状态; 4)休...
2020-07-08 22:37:17 142
原创 7-7_1小记
第八讲-管程,并发编程万能钥匙背景 Java语言1.5之前,提供的唯一的并发原语就是管程;定义 管程之管 - 管理共享变量; 管程之程 - 共享变量操作过程; 管程之结果 - 管理类的成员变量和成员方法,让这个类是线程安全的;发展史 管程模型-Hasen模型、Hoare模型、MESA模型;管程解决互斥问题 1) 思路 - 将共享变量以及对共享变量的操作统一封装起来;...
2020-07-07 22:35:23 268
原创 7-7小记
第七讲 - 安全性、活跃性、性能问题安全性问题: 何为线程安全: 从本质上,就是正确性,程序按照我们期望的执行,不出现诡异的bug; 从理论上,线程安全的程序,就是要避免原子性、可见性、有序性问题; 数据竞争:多个线程同时访问同一数据,并且至少有一个线程会写这个数据的时候,如不采取措施,则会导致并发bug; 竞态条件:程序的执行结果依赖于线程执行的顺序; 解决数据竞争和竞态...
2020-07-07 09:45:01 114
原创 7-2小记
第六讲 - 用"等待-通知"机制优化循环等待引出问题: 上一篇中,破坏死锁条件之一:占用且等待条件,采用的方式是一次性申请所有资源,并且死循环等待资源; 代码如下: ...
2020-07-02 22:50:22 154
原创 7-1小记
第五讲-死锁引出问题: 上一篇文章中,使用Account.class保护有关联关系的多个资源,但是与此同时,却带来性能问题,所有转账操作, A转给B,C转给D,都只能串行执行; 因此,尝试使用细粒度锁来优化性能,如下图代码中所示,一次转账操作中,只锁定转出账户和转入账户,这样A 转给B,C转给D,则可以并行执行; 但是有利必有弊,提高并行度同时,细粒度锁会出现一种情况,比如:线程T1执行A转给B,线程T2执行B转给A,...
2020-07-01 21:58:12 157
原创 6-29小记
第四讲-互斥锁(下),如何保护多个资源引出问题: 保护多个资源,分为两类:有关联关系的多个资源,没有关联关系的多个资源;保护没有关联关系的多个资源: 背景: 账户类Account有两个成员变量:账户余额balance、账户密码pwd; 对账户余额的操作有:取款withdraw()、查看余额getBalance(); 对账户密码的操作有:修改密码modifyPwd()、查看密...
2020-06-29 22:31:03 138
原创 6-27小记
第三讲-解决原子性问题(上)引出问题: 导致原子性原因是线程切换,禁止线程切换,这个问题不就解决了吗? 单核CPU,禁止线程切换,可以保证线程对共享变量的修改是互斥的; 多核CPU,禁止线程切换,无法保证线程对共享变量的修改是互斥的;合理方案: 同一时刻只有一个线程执行,称为互斥;如果能保证对共享变量的修改是互斥的,无论是单核CPU,还是多核CPU, 都能保证原子性;锁模型: j...
2020-06-27 20:46:57 124
原创 6-25小记
第二讲-解决可见性、有序性问题引出问题: 导致可见性原因是缓存,导致有序性原因是编译优化,那我们可能想到,禁用缓存和编译优化,这两个问题不就解决了吗? 可是缓存和编译优化的提出是为了提高性能,如果禁用,程序的性能就堪忧了;合理方案: 按需禁用缓存以及编译优化;然而,java内存模型规范了jvm如何提供按需禁用缓存和编译优化的方法,具体来说,就是三 个关键字(volatile、synchronize、final),六项Hap...
2020-06-25 23:48:02 122
原创 6-24小记
第一讲 - 并发编程bug源头可见性问题: 多颗CPU,多个线程操作一个共享变量,因为每颗CPU都拥有缓存缘故,其操作过程可能是相互独立且不可见的;原子性问题: 高级语言中的一条语句并不等价于CPU的一条命令,并不是所谓的原子操作,而CPU能保证的原子操作是CPU指令级别; 举个栗子: count += 1 ;在高级语言中,它就是一条语句,但是它却对应CPU中三条指令(将count=0加载到寄存器,count+1=1, cou...
2020-06-24 09:08:14 199 1
原创 6-23小记
CTRL + U :从光标处删到开头CTRL + R :搜索历史输入命令spring 在扫描bean的时候会扫描方法上是否包含@Async注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用时增加异步作用。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个 bean 也就是 this. m.
2020-06-23 23:22:38 98
原创 git--创建与合并分支
1、主分支:master、当前分支:head2、新分支:dev 命令: git checkout -b dev 创建并切换分支 等价于:git branch dev 创建分支 git checkout/switch dev 切换分支 3、修改提交dev分支 命令:git add readme.txt gi...
2020-05-12 10:13:20 152
原创 Fastdfs+nginx分布式文件服务器搭建
1、环境准备2、libfastcommon依赖包安装3、Fastdfs安装4、tracker配置、启动5、storage配置、启动6、client配置、上传图片7、nginx安装配置(tracker)8、fastdfs-nginx-module配置9、nginx安装配置(storage)10、参考https://www.c...
2020-01-10 17:51:35 220
原创 Java8 方法参数反射
参数反射 :Parameter对象注意1、javac命令编译java源文件时,默认生成的class文件并不包含方法的形参名信息,因此调用isNamePresent()方法将会返回 false,调用getName()方法也不能得到该参数的形参名;2、如果希望javac命令编译java源文件时保留形参信息,则需要为该指令指定-parameters选项...
2019-12-12 09:12:12 501
原创 JVM(一) Java类的加载机制
1、类的加载 定义:将类的.class文件中二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象, 用来封装在方法区内的数据结构; 类加载最终产品为位于堆区中class对象,class对象封装了类在方法区中的数据结构,并向Java程序员提供 ...
2019-12-04 17:01:13 98
原创 java 内存泄露
1、jvm判断对象可回收标准:引用计数法、可达性分析 引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,释放一个引用时计数减1,计数为0时可以回收; 缺陷:存在对象相互循环引用问题,A引用B,B引用A,此时A、B都不再使用,但因为相互引用,计数器=1永远无法回收; ...
2019-12-04 10:29:50 144
原创 String
1、对象和对象引用:在Java中,不能直接操作对象,所以就有了对象引用,对象引用存储对象在内存中的地址;2、JVM在执行程序时会把内存区域划分为若干个不同的数据区域:方法区、栈、堆; 方法区:运行时的常量池; 栈:基本类型变量,对象引用,方法调用; 堆:创建的对象和数组; 例子:对象存储在堆中,而对象的引用存储在栈中;3、字符串不可变...
2019-12-03 16:00:53 78
原创 IDEA控制台中文乱码问题 、IDEA编码设置UTF-8
设置idea编辑器的编码配置tomcat的编码问题1、在VM options填写-Dfile.encoding=UTF-82、打开idea安装目录bin :idea.exe.vmoptions 文件、 idea64.exe.vmoptions文件在文件后面添加一行:-Dfile.encoding=UTF-8保存文件,重启idea,乱码问题解决...
2019-12-02 15:44:26 5930
原创 IDEA 快捷键使用
1、Ctrl+鼠标点击进去 (定位到该方法对应接口上) 、 Ctrl + Alt + B (定位到该方法实现类上)2、Alt+Insert (生成构造函数,Getter方法,Setter方法)3、Alt+Shift+M (抽取方法)...
2019-11-29 14:24:48 94
原创 IDEA聚合项目子项目不能install ,报错误 Failed to execute goal on project ... ;Could not resolve dependencies for
描述父项目:manager (root)子项目:manager-pojo 不依赖任何项目子项目:manager-mapper 依赖manager-pojo子项目:manager-service 依赖manager-mapper子项目:manager-web 依赖manager-service问题在 manager-pojo中执行完clean和in...
2019-11-29 11:48:58 1236 2
原创 List 转 数组
在项目中需要用到List转数组,使用方式如下:String[] validItemIdArr = (String[])validItemIdList.toArray();报错:ERROR | error:[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;后改为这中方式:String[] validItemIdArr =...
2019-10-23 19:28:10 2179
原创 mysql delete语句别名问题
1、在项目中使用了delete语句,报错,如下图所示:2、去掉别名,正确,如下图所示:3、原因是因为不合理使用别名导致报错,mysql中使用别名正确语法为:总结:mysql中delete语句是支持别名使用的,注意需要在delete关键字后面加上别名...
2019-10-22 16:41:01 380
原创 JDK、JRE、JVM浅析
jdk : javase development kit ,包含java编译器、JRE、以及一些基本的类库jre: java runtime environment , 包含jvm,以及一些类库jvm :java virtual machine , 相当于一台虚拟计算机,专门用来执行字节码文件java程序执行过程 :.java文件 to .class文件 , 用到了java编译器 ,j...
2019-10-18 13:00:50 127
原创 两数之和
题目:给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。me题解:(暴力解法)对于每个元素,通过遍历数组其他元素来寻找目标元素,耗费的时间复杂度为O(n),所以最终时间复杂度为O(n^2);空间复杂度:O(1);官...
2019-09-20 17:33:20 95
原创 “气球” 的最大数量
题目:给你一个字符串text,你需要使用 text 中的字母来拼凑尽可能多的单词"balloon"(气球);字符串text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词"balloon";me题解:1、将待拼凑字符串和给定字符串转换成char数组;2、定义spellArr 为待拼凑字符串char数组,textArr为给定字符串char数组,num为最...
2019-09-19 23:21:48 214
原创 删除排序数组中的重复项
删除排序数组中的重复项me思路:因为是排序数组,所以数组中的元素肯定是递增或者递减的;我们可以定义一个指针start记录去重后数组的下标,然后去遍历原数组;遍历过程中通过比较前后两值是否相等来更新数组元素以及start值;如果不相等,start值加1且更新相应数组值,反之跳过;最后(start+1)则为去重数组大小;me题解:官方题解:...
2019-09-18 17:05:02 65
原创 navicat 迁移mysql数据表到sqlite中,生成db文件
一、项目需要最近更新了项目中维护的地址表(省市区表-来源于高德地图),ios、android端同时也维护了一份地址表,为了保持移动端和后台地址表同步,所以需要将后台中的地址表迁移到sqlite中,生成db文件给ios、android端二、实操1、 使用navicat连接mysql,导出移动端所需要的地址表结构,导出格式为txt,特别注意:导出过程中必须勾选包含列的标题2、 ...
2019-07-11 11:30:34 6526
原创 js计算浮点数加法(精确)
function add(num1, num2) { const num1Digits = (num1.toString().split('.')[1] || '').length; const num2Digits = (num2.toString().split('.')[1] || '').length; const baseNum = Math.pow(...
2019-05-21 16:03:25 2421
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人