自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (3)
  • 收藏
  • 关注

原创 如何保证线程安全?

当代的CPU基本都支持多核,使用多线程能充分利用多核的计算资源,提高系统的整体性能。然而,在多线程共享资源的情况下,容易出现线程安全问题,导致不能预料的结果,即结果存在不确定性。如上述的increase()方法在多线程环境下就是不安全的,如果有两个线程同时执行,可能的结果有 1、2。线程安全问题的根源是:多个线程同时修改一个共享资源,由于没有做足充分的线程安全措施,导致结果的不确定性。即三个条件:(1)多线程环境;(2)可修改的共享变量;(3)存在多个线程修改共享变量的情况。

2024-01-29 00:10:12 394

原创 ThreadLocal学习笔记

这是Thread类的局部变量,每个线程私有。它主要用于解决多线程中的数据共享问题,保证线程安全。每个线程都可以修改自己的变量副本,而不会影响其他线程的变量副本。它为每个线程提供了一个独立的变量副本。和是阿里巴巴提供的为解决跨线程上下文的InheritThreadLocal的子类,引入holder来保存需要在线程间传递的变量。可跨线程、跨线程池。

2024-01-29 00:09:24 538

原创 蚂蚁一面凉经

【答】正确答案是,当数据很大时,性能会下降,因为每次查询都需要将所有数据加载一遍,解决办法是:用子查询或联合查询将最大的ID定位到,然后where语句去查询大于等于该最大ID的记录,这样就能直接从分页查询的第一个数据开始匹配了。【答】正确答案应该是,只有getStudentByName会打印日志,而当getStudentByName调用执行getStudentById时,不会打印日志,此时是Demo对象的调用,不是代理对象调用。【答】最左匹配原则,必须先有省,才会匹配市,必须先有省市,才会匹配区。

2023-10-09 23:34:10 349

原创 高性能实践

从用户体验来看,性能就是响应时间短;从开发角度来看,性能主要是执行效率高。性能主要表现形式如下:(1)响应时间,AVG、MAX、MIN、TP95、TP99(2)吞吐量,QPS、TPS(3)资源利用率,CPU、内存、网络IO、磁盘IO(4)错误率。

2023-09-21 13:02:53 279

原创 Java多线程基础

多线程

2023-09-19 17:13:29 264

原创 什么是微服务?

微服务就是一些协同工作的小而自治的服务。

2023-05-22 11:54:50 436

原创 一文学完Java集合框架

在Java开发当中,集合框架是最常用的数据结构,了解并掌握它们至关重要,最常用的如ArrayList、HashMap、HashSet,针对线程安全集合类有CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap(本文未涉及,感兴趣自己查阅资料)。

2023-03-18 18:06:05 487

原创 浅析“面向对象编程思想”

面向对象编程(Object-oriented programming,OOP)是一种成熟的计算机编程模型,软件是围绕数据或对象而不是功能逻辑来组织的。

2023-03-18 12:06:19 874

原创 Heroku的12条准则

严格分离构建、部署阶段,分开的好处是假如出错了,能快速发现错误出现在哪一步,再说,它们构建和部署类比编译和运行,是天然分离的两个步骤。代码和配置分离有很多好处,因为代码从开发、测试、构建、部署是很长的一条链路,开发成本高,而纯配置只需要改一下就好,几乎没什么成本。尽可能无状态,因为无状态服务不存在线程安全问题,无状态的服务更加简单、不易出错。而有状态的服务,要考虑线程安全问题,还容易出错。并发而不是顺序执行,能有效挖掘多核CPU的性能,能系统增大吞吐量,提高QPS。将支持的服务视为附加资源,不知所云。

2023-02-24 17:50:42 352

原创 手写一个简易版本的RPC

在1024程序员节前夕,学习技术是对节日最好的庆祝。手写一个简易版的RPC,可以把模糊抽象的概念具像化,属于落地层面了。

2022-10-22 23:34:32 383

原创 常见Java基础问题

1. 为什么对象要重写hashcode和equals?如果对象没有重写hashcode,会调用Object类默认的hashcode,即对象所在的内存地址,这会引起一个问题,在hashmap中的key需要先比较hashcode的,假设hashmap中存在一个{student(id=1):"你好"}的键值对,那想要再获取这个键值对的值,就无法实现了,新建的对象student即使id为1,也无法通过map.get(student);的方式获取。也就是说,没有重写hashcode,就只能put而不能get了,除

2022-01-04 17:38:10 471

原创 Welch_Powell图的顶点着色算法,O(n3)

import java.util.Arrays;class Vertex implements Comparable<Vertex> { int color; int degree; @Override public int compareTo(Vertex o) { return o.degree-this.degree; }}public class Welch_Powell_Color { final st..

2021-12-22 18:08:38 960

原创 Java 8流处理详解

一、初识流1. 什么是流?流是Java API的新成员,它允许你以声明性方式(类似SQL,只写做什么,不考虑怎么做)处理数据集合。流就是从支持数据处理操作的源生成的元素序列。源可以是集合、数组或IO资源,数据处理操作包括filter(过滤),map(映射),reduce(累积操作),find(查找),match(匹配),sort(排序)。流可以顺序执行,也可以并行执行。2. 集合与流集合是内存中的数据结构,静态地包含所有值。流是从数据源中不断读取数据的固定数据结构,动态地获取值。和迭代器

2021-10-15 12:04:38 3874

原创 Java 8实战——行为参数化Lambda表达式

Java 8之前,参数只能是基本类型或对象引用。Java 8出现后,方法作为参数变得现实,也即函数式编程。案例:果园大叔家的苹果熟了,收割后全装到一个箱子里了,现在要对苹果进行分类,将红苹果和绿苹果分开,将大苹果(重量大于等于150g)与小苹果(重量小于150g)分开。尝试1: 传统思路import java.util.ArrayList;import java.util.List;public class Apple { Color color; int weigh.

2021-10-03 17:03:59 149

原创 MySQL索引学习笔记

索引失效的情况: or的两边,有一边没有使用索引 索引列使用like以%开头 索引列使用了<>不等于比较 联合索引不满足最左前缀匹配 索引列使用了函数,或类型转换 索引的类型: B-Tree索引:全键值查询,键前缀查询,键范围查询 Hash索引 局限性:(1)不能使用范围查询;(2)不能模糊查询和前缀查询;(3)不能使用<> R-Tree空间数据索引 全文索引,仅MyISAM存储引擎

2021-09-24 19:45:26 64

原创 ebay电话面试记录

1. 做个2分钟的英文自我介绍吧。我:啊,我没准备。面试官:没事,就说下你叫什么,哪个学校,什么专业。2. HashMap的put过程,扩容过程,loadfactor3. JVM虚拟机GC算法(可达性分析算法)4. GCroots根节点有哪些(方法区的静态变量,虚拟机栈的局部变量,本地方法栈的变量)5. 四种引用类型(强,软,弱,虚),软引用和弱引用的区别?举一个软引用的例子。6. 线程的状态(新建,运行(运行和就绪),等待,休眠,阻塞,终止)7. TCP/IP熟悉吗?了解一

2021-09-08 12:14:50 396

原创 总结CyclicBarrier和CountDownLatch的异同

CyclicBarrier是循环(Cyclic)+Barrier(屏障),只有当线程达到一定数量时,才会继续执行。类似于组团旅游,打麻将三缺一,有的线程达到比较早,会一起等待还没有到达的线程。CountDownLatch是主线程await阻塞,类似于一个“倒计时器”,工作线程每完成一个子任务都会调用countdown方法(state-1),直到state减到0,主线程才会继续。它们都是java.util.concurrent包下的线程同步类,用于一个任务的分发处理。不同点:最大的差别在于,C

2021-08-14 15:22:57 372

原创 Spring事务失效的场景

Spring的事务使用:@Configurationpublic class SpringTransactional { @Transactional public void test1() { } @Transactional public void test2() { } public void test0() { }}注意,@Transactional注解若加在类上,表示所有类使用事务。而@Configur

2021-08-10 11:48:06 72

原创 Spring的三种开发模式

Spring的三种开发模式:基于XML的开发模式,基于注解的开发模式,基于Java Config的开发模式。1. 基于XML的开发模式配置xml文件,在里面定义bean,然后ApplicationContext中传入xml文件地址,就可以通过getBean来获取对象了。构造器注入,set注入构造器注入适用于必须要初始化的值(必选项属性),set适用于懒加载的属性(可选项属性)。2. 基于注解的开发模式在xml文件中,添加<context:component-scan ..

2021-08-08 13:18:09 564

原创 Java多线程进阶——Java并发包之锁的使用和实现原理

目录Lock接口Lock接口具备synchronized不具备的特性队列同步器独占锁和共享锁以独占锁的实现为例同步队列原理独占锁获取与释放原理共享锁的获取与释放超时获取独占锁可重入锁ReentrantLock可重入锁公平锁和非公平锁为什么非公平锁性能好?读写锁写锁的获取与释放读锁的获取和释放锁降级LockSupport工具Condition接口Lock接口Lock lock=new ReentrantLock();lo.

2021-08-05 16:35:53 173

原创 Java并发基础——初识线程

Java语言从诞生之初就多线程作为基础模块内置在jdk中,这是因为合理恰当地使用多线程,程序性能会有很大提升。为什么要使用多线程?为什么恰当使用多线程性能就会提升?底层硬件是由操作系统来调度的,而应用程序都是跑在操作系统上的,因此,有必要复习一下操作系统的发展史。操作系统发展史手工操作:纸带作为输入输出的媒介,机器是单线程式的,专一地干活。批处理系统:计算机能够成批处理多个作业,机器是单线程式的,吞吐量增大,局限在于流水线式工作,顺序固定,CPU利用率低。多道程序系统:多个程序同时加

2021-08-05 10:38:58 167

原创 Java并发机制与Java内存模型JMM

零、预知识1. CPU、缓存、内存如下图,是Intel i5-4258U的处理器和内存模型,Core表示处理器,即CPU,它包含了L1级缓存和L2级缓存,L3级缓存被两个处理器共享,CPU通过总线与内存打交道。2. 引入缓存的原因CPU速度很快,读写内存速度相对来说太慢了,引入缓存,就是为了解决CPU和内存速度不匹配的问题,从而提高计算机整体运行效率。3.缓存的容量和速度越靠近CPU的缓存,速度越快同时容量越小价格高,越靠近内存的缓存,速度越慢同时容量更大价格越低。容量:L1

2021-07-31 00:10:17 185

原创 字节跳动后端开发一面 凉凉

一面先做个自我介绍。如果让你来实现HashMap,你会怎么做?put的过程?hashcode怎么找到数组下标?hashmap如何扩容,是直接复制到新的数组吗?为什么新数组是原数组长度的两倍?(1)数组+链表,红黑树。(2)通过hashcode找到数组下标(见3),equals比较key,如果找到了key,则用新的值覆盖旧值,否则插入到末尾。(3)hashcode和右移16位的hashcode做异或运算,得到的结果h和(数组长度-1)做与运算可以得到下标,这也是为什么扩容时数组长度是两倍的

2021-07-22 19:47:39 169

原创 Neo4j导入数据的5种方式详解配图

一、前言Neo4j导入数据的方式有:使用LOAD CSV导入数据使用APOC导入数据使用编程语言(Java,python,js,C#,Go)导入数据使用neo4j-admin工具导入数据使用应用导入数据使用ETL工具导入数据具体选择哪种导入方法取决于:数据量大小使用者对导入方法的轻松度感受有多少时间来导入各种导入方法的精力-效率图像如下图:横坐标表示导入的效率,LOAD CSV导入比较慢,而neo4j-admin工具导入比较快。纵坐标表示人耗费的精力,LOAD CSV比较

2021-04-27 21:57:26 24004

原创 MySQL数据库之SQL实例(字符串处理+数值处理+日期处理+SQL连接模式)

本文分为以下几个方面来介绍SQL实例:字符串处理数值处理日期处理常见SQL连接模式一、字符串处理遍历字符串嵌入引号统计字符出现次数删除不想要的字符判断含有字母和数字的字符串分离数字和字母(*待续)提取姓名首字母(*待续)将group分组后的字符串用逗号拼接1. 遍历字符串目标:从前向后遍历字符串,从后向前遍历字符串;从前往后依次删除第i个元素,从后往前依次增加第i个元素。先建立一张下标表:select substr(e.name,iter.pos,1) as a,

2021-04-17 13:09:30 313

原创 线性规划之单纯形法

一、前言迭代改进思想是算法设计中常用的求解最优问题的方法,一般思路是:任取一个可行解判断可行解是否是最优的,若是,算法结束若不是,找到一个比当前可行解更好的可行解,并替代它,继续步骤2事实上,判断可行解的过程就能找到(或不能)一个更好的可行解。线性规划问题,是在约束条件下求最大值或最小值的问题。例如显然z=3x+5y的x越大越好,y越大越好。x=3,y=1得zmax=14而解线性规划问题最好的方法,就是单纯形法了,它也是用到了迭代改进的思想。此外,网络最大流问题,二分图的最大匹配问

2021-04-15 17:53:02 5472 1

原创 OJ时间与效益

问题分析:这是第一个测试用例的草图,可以得出结论,每个任务只耗费1个时间单位,因此优先选择ddl大的任务,在ddl相同时优先选择profit高的那个。如本例中,先选择1号(因为它的deadline最长),获得效益20,再从ddl=1中选取效益最高的3号,获得效益40,即20+40=60。算法思路:将所有存在的deadline按照递减顺序保存起来,将deadline与对应存在的效益列表建立映射关系。每次遍历时,都能确保是最大的 ddl,从效益列表取一个最大的效益出来,该列表剩余的效益继续存放到下一个d.

2021-04-12 23:13:11 124

原创 算法-订单问题Java实现

动态规划来实现:首先初始化第一行,a. 只要能没有达到最大数X,就由A来做b. 否则查找之前的A做的最小收益的任务,取当前收益与最小收益的最大值接着更新第二行a. 凡是A未做的,B一定会做(不然就是题目错了,X+Y一定>=N)。b. 若A已做,比较A[i]和B[i](1)若A[i]>B[i],说明A来做更好(2)否则,理论上B来做更好,事实上要分情况:a. 若B当前已做的数目小于Y(最大数),则B替换A来做b. 若B当前已做的数目=Y,计算当前变化量B[i]-A[i],查.

2021-04-01 11:48:56 310

原创 算法-按照要求保留数组元素使得和最大Java

分析:sum=0取数组最大的数maxsum+=max删除数组最大元素max和值为max-1的数继续步骤2,直到数组空了直接思路:删除用标志-1来表示import java.util.Scanner;public class SumMax { //查找最大元素下标 public static int selectTheMax(int[] num){ int max = -1; int pos = -1; for(int i=0.

2021-04-01 11:33:57 96

原创 格子里的整数-算法Java

import java.util.Scanner;public class FindMinPath { public static void main(String[]args) { Scanner sc=new Scanner(System.in); int testcase=sc.nextInt(); for(int i=0;i<testcase;i++) { int n=sc.nextInt(); int[][]arr=new int[

2021-03-29 10:48:10 129

原创 OJ如何花最少的钱购买蔬菜

要求:需要购买三种蔬菜,三种蔬菜必须在不同的商店购买,使得花费最省。import java.util.Scanner;public class BuyVegetable { public static void main(String[]args) { Scanner sc=new Scanner(System.in); int testcase=sc.nextInt(); for(int i=0;i<testcase;i++) { int n=sc.

2021-03-27 12:52:46 148

原创 Searching_4 磁铁数组问题Java实现

磁铁数组问题描述分析,每两个数之间必定有一个解,使得左右合力为0方法1:左合力=右合力import java.util.Scanner;public class Magnet { public static void main(String[]args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); for(int i=0;i<n;i++){ //1.输入

2021-03-10 09:57:50 114

原创 有9个因数-算法java实现

这道题考的是数学,如果暴力破解,估计会timeout,可以化简。首先,根据用例40,推断出36有9个因数,分别是1,36,2,18,3,12,4,9,6。最后一个6需要注意,6*6=36。从特殊到一般,大胆推理,有9个因数的数一定是一个平方数(如1,4,9,16,25,36),因为只有这些数才有复因子。其次,化简判断有9个因子的条件:一个数必然包含1和本身,且平方数必然包含一个因子k(n=k*k),count=3count=3;//k为n的平方根for(int i=2;i<k;i+.

2021-03-10 00:35:23 221

原创 Searching_3查询问题算法java实现

方法1:直接拼接一个数组import java.util.Scanner;public class Main { public static void main(String[]args) { Scanner sc=new Scanner(System.in); int testcase=sc.nextInt(); for(int i=0;i<testcase;i++) { int groupnum=sc.nextInt(); int q.

2021-03-09 23:28:21 119

原创 一图理解使用SQL需要考虑的5个因素

访问的数据量大小过滤条件,过滤的越多越好结果集大小,有时需要排序,分组等表的数量,多张表需要join连接代价高,SQL变得复杂,出错概率高且不容易理解,查询优化器优化sql时需要列举过多的执行路径,可能导致timeout访问数据库的用户数量,并发性...

2021-03-09 09:25:21 117

原创 书本分发——经典的数组分段求和最小问题,动态规划+二分查找法

说明给你N本书。每本书的页数都是π。你必须把书分配给M个学生。有许多方法或排列可以做到这一点。在每个排列中,M个学生中的一个将被分配最大页数。在所有这些排列中,任务是找出分配给学生的最大页数是所有其他排列中最小页数的特定排列,并打印这个最小值。每本书只分配给一个学生。每个学生至少要分配一本书输入第一行包含表示测试用例数的’T’。接着是对T的描述测试用例:每个用例从一个正整数N开始,表示书。书第二行包含N个空格分隔的正整数,表示每行的页数预定。然后呢第三行包含另一个整数M,表示学生人数N训练:1<

2021-01-04 20:24:42 1312

原创 高性能MySQL读书笔记第5章-创建高性能的索引

1.索引的优点1.大大减少了服务器需要扫描的数据量;2.帮助服务器避免排序和临时表;3.将随机IO变为顺序IO《Relational Database Index Design and the Optimizers》的三星系统:索引将相关记录放到一起则获得一星;如果索引中的数据顺序和查找中的排列顺序一致则获得二星;如果索引中的列包含查询需要的全部列则获得三星(即索引覆盖)索引的缺点主要是使得插入、更新、删除变得复杂,并且占用更多的存储空间;2.高...

2020-12-22 23:32:52 92

原创 高性能mysql读书笔记第4章-Schema与数据类型优化

1.选择合适的类型:更小的通常更好、简单就好、尽量避免NULL2.数据类型:-0- 数值类型1.整数类型: TINYINT(1字节,相当于byte),SMALLINT(2字节,相当于short),MEDIUMINT(3字节),INT(4字节),BIGINT(8字节,相当于long)2.浮点类型:FLOAT(4字节),DOUBLE(8字节)、DECIMAL(小数点前4字节、小数点1字节,小数点后4字节,共9字节)-1- 字符串类型...

2020-12-22 23:32:07 121

原创 设计模式之状态模式State Pattern详解Java版

一、定义The State Pattern allows an object to alter its behaviorwhen its internal state changes. The object will appear tochange its class.状态模式允许一个对象当它的内部状态改变时,改变它的行为。对象能够改变它的类。类图:二、实例实现口香糖自动贩卖机的状态变化:翻译:No Quarter(默认状态),insert quarter(投入硬币),Has Quar

2020-07-29 22:44:36 198

原创 设计模式之组合模式Composite Pattern详解Java版

一、定义The Composite Pattern allows you tocompose objects into tree structures torepresent part-whole hierarchies. Compositelets clients treat individual objects andcompositions of objects uniformly.组合模式允许你组合对象到树结构中来代表部分和整体的层次结构。组合让客户端统一对待单个对象和组合对象。二

2020-07-28 19:47:29 207

计算机作品赛-捉羊大作战

抓羊大作战是个小型的益智类游戏,整个游戏使用java语言进行编写,依托于java环境,适用所有Windows系统。 游戏中人物使用的是灰太狼和懒羊羊这两个卡通人物,更增加了游戏的趣味性。玩家可通过对灰太狼的操作来实现对懒羊羊(即箱子)的推动。 游戏风格较为简约,朴素。 游戏共分6个关卡,难度随关卡递增而增加,这样有助于玩家的思考。而玩家也可以在游戏中随意选择关卡进行游戏。

2019-07-09

正则表达式工具regexbuddy

正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy正则表达式工具regexbuddy

2017-09-27

myeclipse破解工具

myeclipse2016破解工具是一款针对myeclipse 2016而开发的破解补丁文件,功能强大,操作简单,可以帮助用户轻松破解myeclipse2016软件,让用户永久免费使用,其详细的破解教程可参考下文操格。有需要的朋友们就赶紧来下载试试吧! 基本介绍 myeclipse是对EclipseIDE的扩展,主要用于Java、Java EE以及移动应用的开发,它可以帮助我们在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。软件包括了完备的编码、调试、测试和发布功能,完整支持HTML、Struts、JSP、CSS、Javascript、Spring、SQL、Hibernate等代码,以其优秀的产品力,深受用户喜爱,是业内公认的巨头级产品。 myeclipse2016破解教程如下 以MyEclipse Professional 10.6 为例来介绍如何破解myeclipse2016。 本文使用的myeclipse2016破解补丁对MyEclipse Standard/ Professional/ Blue/ Spring的10.x版本均有效(例如:MyEclipse 10.0、MyEclipse 10.1、MyEclipse 10.5、MyEclipse 10.6、MyEclipse 10.7.1等)。

2017-09-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除