- 博客(41)
- 资源 (1)
- 收藏
- 关注
原创 lock死锁
这种情况就是一个死锁。线程 A 和 线程 B 获取资源的顺序要一样,当线程 A 是先尝试获取资源 A,然后尝试获取资源 B 的时候,线程 B 同样也是先尝试获取资源 A,然后尝试获取资源 B。比如下图,如果线程 A 已经持有的资源,不能再同时被线程 B 持有,如果线程 B 请求获取线程 A 已经占用的资源,那线程 B 只能等待,直到线程 A 释放了资源。比如,线程 A 已经持有资源 2,而想请求资源 1, 线程 B 已经获取了资源 1,而想请求资源 2,这就形成资源请求等待的环形图。(破坏不可剥夺条件)
2024-06-24 10:59:03
1045
原创 lock-锁的概念
锁是计算机协调多个进程或线程并发访问某一资源的机制(避免发生资源争抢)在并发环境下,多个线程会对同一个资源进行争抢,可能会导致数据不一致的问题。为了解决这一问题,需要通过一种抽象的锁来对资源进行锁定,锁就是对共有的资源进行了保护,保证程序在并发场景下有条不紊的,安全性的运行。锁通常需要硬件支持才能有效实施。这种支持通常采取一个或多个原子指令的形式,如"test-and-set", “fetch-and-add” or “compare这些指令允许单个进程测试锁是否空闲,如果空闲,则通过单个原子操作获取锁。
2024-06-20 17:25:01
964
原创 synchronized原理
当线程释放锁,JMM会把线程对应的本地的内存中的共享变量刷新到内存中当线程获取锁,JMM会帮其他线程中对应的本地的内存中的共享变量设置未无效,从而监视器保护的临界区的代码必须从内存中读取共享变量。(临界区为锁之间的代码)
2024-06-19 10:02:55
515
原创 volatile原理
volatile是java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。一方面volatile不会造成上下文切换的开销,另一方面它又不能像synchronized那样保证所有场景下线程安全,因此必须在合适的场景下使用volatile机制。在每个volatile写操作的后面插入一个StoreLoad屏障。在每个volatile读操作的后面插入一个LoadLoad屏障。在每个volatile读操作的后面插入一个LoadStore屏障。内存屏障解决了有序性。
2024-06-19 10:01:29
369
原创 JMM和底层实现原理
*Java 内存区域和 JMM 有何区别?**这是一个比较常见的问题,很多初学者非常容易搞混。Java 内存区域和内存模型是完全不一样的两个东西JVM 内存结构和 Java 虚拟机的运行时区域相关,定义了 JVM 在运行时如何分区存储程序数据,就比如说堆主要用于存放对象实例。
2024-06-18 10:22:37
439
原创 CPU多核并发和一致性MESI协议
的引入,导致 存储缓存写入缓存行和执行失效队列的时机需要十分合适才能尽可能释放CPU的处理能力,实际上CPU并不知道什么时候会执行,因此将这个任务留给了写程序的人,这就是我们常说的。是对方CPU还有没有将值的状态修改为无效,就读取返回。我们知道处理器的处理速度很快,内存处理速度远远赶不上处理器的处理速度,为了解决CPU处理速度和内存处理速度不对等的问题,我们引入了CPU Cache。内存屏障:是CPU或编译器对内存随机访问的操作的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行之后的操作。
2024-06-18 10:21:37
506
原创 并发编程目录
ThreadList里面循环从队列中去Runnable任务,并调用run方法。者模型,线程池是消费者,调用者是生产者。,一个已经跑起来的工作线程组T。线程池对象里维护一个阻塞。
2024-06-18 10:20:38
567
原创 java8升级到JDK21
需要将javax.validation.Validation 替换为 jakarta.validation.Validation。如果依赖了springcloud,则需要升级到对应spring-boot3.0的版本,最新依赖都是可行的。将javax.servlet.http.HttpServletRequest。修改完后记得刷新maven依赖clean一下,在重启项目!1.Validation类变更。如Resource替换。
2024-06-06 10:57:37
1405
原创 JDK21安装
* 需要注意,如果是下载exe文件进行安装,会自动新增了path路径,该路径一定是放到了最前面,在加载的过程中,会已第一个路径为准,导致前面的配置无效,此时做法是删除这条路径,或者是将配置路移动到该路径的前面**点击新建系统变量名为"CLASSPATH",变量值为".;在系统变量中找到Path变量点击进行编辑,点击新建输入"%JAVA_HOME%\bin"
2024-06-06 10:38:43
727
原创 如何设计兜底方案(高可用)
场景:很多时候,在同步数据时,都会有一个重新推送的按钮,不管是重新推送还是重新拉去。这些动作都是失败后,再次操作,直到成功。
2024-06-04 15:40:08
671
原创 统计每个活动的用户访问量,且每个用户仅统计一次
在深入思考一下,是否有更高效的方式呢,毕竟每次都需要查询数据库一次,而且这种活动,访问的用户也不少。创建了用户活动的访问记录表,用户访问当期活动时,都会查询一次表格内容,来判断用户是否访问过该用户,如果已存在了,则不走后续逻辑。首先活动表是已经存在了的,一般情况下,我们都会在创建一个用户访问表,其中唯一主键是用户ID+活动ID作为唯一主键。(offset为偏移量,value设置的值,在上述中,将offset设置为用户ID,value直接设置为1)场景:统计每个活动的用户访问量,且每个用户仅统计一次。
2024-05-27 11:08:29
573
原创 @Transactional导致的长事务
在编码过程中,需要考虑到在事务中避免做耗时的操作。如果在事务中调用第三方,则需要设置请求相对较短的超时时间。
2024-05-22 15:42:33
824
原创 说一说@Transactional
在简单的场景下,直接使用@Transactional注解来进行编码,注意上述失效场景。但是在复杂的场景下,就容易产生长事物,因为我们知道,在调用方法的时候,就先获取到了mysql的连接,并且开启了事物,需要特别注意。
2024-05-22 15:14:28
798
原创 生成ID的方式
生产ID编码的方式有很多种,根据自己的需求来定,一般情况下,UUID和Redis自增的方式或者特殊编码格式,就能满足需求。雪花算法也是能够满足场景的,在不考虑它时间回调导致重复的问题。极少的场景需要额外引入如 美团(Leaf)生产ID的框架。
2024-05-19 00:10:54
766
原创 什么是浅拷贝、深拷贝
SerializationUtils.clone() apache.commons.lang3包下,将对象先转化为流,在转化为目标对象。深拷贝是创建了一个新的变量,同时创建新的空间将原对象数据复制,新变量指向了新开辟出来的对象地址。如果修改了复制对象中的属性和元素,原始对象中的对应属性和元素不会受到影响。浅拷贝是创建了一个新的变量,该变量指向了对象的地址,这两个变量共享了同一个内存地址。在计算机内存中,每一个对象都有一个地址,这个地址指向对象在内存中存储的位置。这个过程可以分三个步骤。
2024-05-13 20:51:33
427
原创 为什么不建议直接使用@Async
从Spring3开始提供了@Async注解,被该注解标注的方法,Spring底层会新建一个线程池或者使用已有的线程池中的线程去异步的执行被标注的方法。
2024-05-12 18:30:00
1739
2
原创 java 拦截、过滤器2
ControllerAdvice认识、RequestBodyAdvice和ResponseBodyAdvice认识与原理、HandlerMethodReturnValueHandler认识与原理
2023-07-23 15:52:54
97
原创 mysql数据库设计规范与原则
一、命名规范与设计规范1.1 数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’_'组成;命名简洁明确(长度不能超过30个字符);例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀;除非是备份数据库可以加0-9的自然数:user_db_20151210;1.2 数据库表名命名规范采...
2020-04-12 16:39:32
337
原创 学习当前流行框架,同时也要自己去造建议的框架
在网上看到一个帖子,一个Java程序员,工作一段时候后,因为公司没有使用最新的框架,还是使用之前老套的框架,然后离职了。该帖子下的留言是,程序员只要有活干给钱,做什么都无所谓。旧框架也是能够学习到新的东西。学习新的框架,可以私底下学习,而公司的项目要平稳,不能激进的使用新框架。其实这些都没有错,在一个岗位上,肯定优先使用稳定的框架,或者是让之前旧代码一直稳定的运行下去。但是对于一个程序员来说,...
2019-10-28 23:27:00
176
原创 程序员之间的交谈
前天和大学的室友碰了一面,交流了很多东西。因为一起在深圳打拼,很多时候,两个人就一起交谈,谈谈最近的生活情况和工作感悟。下面总结一下我俩交流的信息。最开始的两三年,是学习的黄金时间程序员刚踏入工作,是自己成长最快的时候,是自己最能够学东西的时候。因为那个时候,对技术有着痴迷和热爱。我们都认为前面一两年,学的东西特别多。那个时候什么都不会,每天被逼着去学习以前大学没有学过的东西,经常加班加点的做...
2019-04-22 07:37:39
305
原创 成为一个小的管理者
成为一个小的管理者一、分解任务二、协调工作和人员之间关系三、代码检查四、解决问题对于入职场没几年的人来说,管理一个团队的机会比较少,大多是会有一个老大来管理自己,但是管理的能力确实我们需要好好的学习。对于程序员来说,逐渐的一部分的精力会花费到管理上来,不管自己愿不愿,毕竟到了一定阶段,我们都将会是一个独挡一面的人,但一个项目不太可能只有自己一个人,如果管理,如何协调周围的人,让项目快...
2019-04-16 00:53:49
155
原创 java里面如何提升编写速度
一般情况下,编写程序,是在规定的时间内,并且在一段时间内很好的按成,那么就必须要套用现成的东西。在一个新的功能中,如何调用现成的东西呢,那么就是使用第三方包或者是使用自己总结的代码库。接来下是自己看到的一些好的代码库和自己总结的代码库。通用库经常被使用的到apache 的集中包例如apache commons的包,goole guava包,至少需要知道其中的几个关键的类如StringUt...
2019-03-01 23:15:44
132
原创 小项目也可以学习到很多东西
今天分享关于最近做的一个小项目学习一些感悟。一、小项目也能学习到非常多的知识最近做的是一个数据整理的一个项目,后台系统需要一些统计的数据,如果从原有的系统中查询,会大大影响到其他端的性能,而且相对于手机端去直接用户,后台系统面对的是公司人员和运营人员,用户量少,但是查询的数据确不少,需要做大量的计算,而这大量的计算就耗掉服务器的性能。为了保证线上手机和前端的性能,数据库做了优化工作,建立的索引...
2019-03-01 23:14:01
169
转载 使用VisualVM分析性能
对于java虚拟机,像我这样工作才两年的会是比较陌生和神秘,但是时候,需要对JVM有一定的认识,并且能够设置一些参数。下面是自己学习到的内容。这里需要使用一个java自带的一个工具,VisualVM。使用IDEA下载一个VisualVM。一、查看程序的JVM内存首先任务参数有不要设置,然后编写一个程序。 1 2 3 4 5 6 ...
2019-03-01 23:10:58
151
原创 Flume初始
一、Flume是什么Flume是一个数据,日志收集的一个组件,可以用于对程序,nginx等日志的收集,而且非常简单,省时的做完收集的工作。Flume是一个分布式、可靠、和高可用的海量日志采集聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集日志,同时Flume对日志做简单的处理。Flume作为一个非常受欢迎的日志收集工具,有如下几个特点:flume的可靠性flume的某个节点...
2018-12-30 13:30:35
132
原创 JVM的理解
一、JVM如何执行程序Java程序如何做到跨平台的,其底层就是运行的JVM虚拟机,JVM虚拟机就Java编写的代码,首先先解析成class文件,JVM然后去解析class文件成机器码,最后执行。机器码是各个操作系统中可识别的,且能够执行的。程序执行会分两个步骤Java代码解析成Java字节码即class文件JVM解析成机器码操作系统执行机器码二、JVM结构三、JVM类加载过程类加...
2018-12-24 23:01:34
96
原创 自己的Java规范文档
参考阿里Java规范文档不建议使用过时方法泛型需要加上<>,这种方式创建的对象是不推荐的。Map object = new HashMap();//禁止使用字符串比较时,不需要大小写时,使用equalsIgnore方法,不使用toUppers方法str.equals(string.toUppers());//不推荐使用str.equalsIgnore(...
2018-12-16 10:29:44
214
原创 版本是否需要更新
做JavaWeb项目,需要引入大量的 jar 包,再引用 jar 的时候,是否想到引入最新的版本,还是 copy 以前的项目来中的配置过来。而随着时间的推移,是否会想着要更新版本。提出的两个问题,可能工作中很少去思考的问题,一般情况下,引入 jar 包时,从以前的项目中拷贝过来,因为 maven 项目中,引入的 jar 包,很可能产生包的冲突,会因为这样的问题,延误自己的工作。不使用最新的 j...
2018-12-09 12:06:43
232
原创 关于DeferredResult的思考
使用SpringBoot搭建web程序,里面内置了tomcat,一般都不会关心内部实现机制,上来就可以写程序,并且可以跑起来。但是是思考了每次的请求是如何工作的。简单的来讲就是tomcat是将每次请求都将封装成一个Servlet,该Servlet来运行完业务逻辑代码,然后再有tomcat将信息返回给调用方。每个Servlet是同步的。即在该servlet的业务逻辑做完了然后才释放掉该Servle...
2018-12-07 00:06:02
2190
1
原创 nginx自动部署脚本
需要下载脚本中需要的jar包nginx.pcre和zlib,自己也上传了一个自己部署的包https://download.youkuaiyun.com/download/qq_17842663/10822976因为csdn上传的资源必须要设置一个需要下载分,好像不能免费下载了,可以自己去官网下载。脚本如下(nginx.sh):#!/bin/sh#/opt/hadoop# |...
2018-12-02 17:12:15
670
原创 我Java学习时的模样(三)
读Java源码平常使用Java的时候,那些集合类使用起来很顺手,但是有没有想过这些集合内部的实现原理是怎样的,它的添加移除都有哪些操作? 有了一些工作经验之后,必须要读一读Java包中的源码,需要知道那些平常使用的类的原理。有一点,不要被这些类的行数给吓到,点击一些集合类,一个类的代码行数都一千多行,很多时候回被这个数字给吓到,除去注释空格,其实也没有多少了,并且只要理解了一点,该类的其他代码就...
2018-11-29 00:11:18
112
原创 我java学习时的模样(二)
去掉自己浮躁的心工作了三年,见识过高山,也见过低估,高山同大神一起共事,低估是几家特别烂的外包公司,现在有了另一种心境。已经开始重视自己,去掉当初浮躁的心。 毕业的一两年内,是人成长特别快的时期,也是特别容易浮躁,成长特别快,是开始负责公司一些模块,开始独立完成任务,在这段时间,可以接触大学没有学到的东西,而特别希望通过自己的能力改变什么,然后特努力去学习,自然而然,个人的成长可以用肉眼能够看得...
2018-11-29 00:00:18
119
原创 我java学习时的模样(一)
学会敲键盘,能够实现盲打程序员写代码,是通过键盘将程序输入到编辑器中,而码子的高效,能够让自己的思路更流畅一些。如果想从事IT工作,那面打字就必须得会,并且,如果还一个一个字母去找,上司就会认为是一个低级程序员。我在上大一的时候,也是敲键盘,需要一个字母一个字母的去找,而想要敲一个程序,至少需要十多分钟,就十多行代码,敲完之后,根本不记得程序的逻辑,所有的经历都放在了找字母上。等自己买了电脑之后...
2018-11-28 23:59:11
173
原创 jdk 自动化脚本
添加没有登录权限需要理解linux用户,首先登陆的是root用户,拥有所有的权限,但是该权限太大,一般都会分配其他用户使用,并且在部署程序时,需要分配一个没有登录权限的用户,这样改程序不能随意被修改,如何添加没有登录权限的用户和用户组如下:groupadd groupnameuseradd -g groupname username -s /bin/false //-s为默认shell...
2018-11-22 01:23:04
225
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人