java基础
文章平均质量分 69
Louis.No1
这个作者很懒,什么都没留下…
展开
-
JUC——BlockingQueue
BlockingQueue它继承自Queue接口,核心方法主要包括:上面四种元素操作分类都是在需要阻塞时,处置结果的不同:BlockingQueue的实现类:ArrayBlockingQueue继承自AbstractQueue并实现了BlockingQueue接口,它在创建的时候必须传入数组的长度,而不像ArrayList一样有自己的扩容机制;并且队列长度一但创建不允许再修改;ArrayBlockingQueue依赖于ReentrantLock,所以它也提供公平和非公平的策略,默认是非公平模式;1.2原创 2022-07-03 21:45:00 · 226 阅读 · 0 评论 -
JUC——ReentrantReadWriteLock
ReentrantReadWriteLock是读写锁,写写互斥,读写互斥。它实现了ReadWriteLock接口,接口内定义了readLock和writeLock接口;ReentrantReadWriteLock是基于AQS实现的加锁功能,支持公平式抢占和非公平式抢占;2. WriteLock实现在创建WriteLock的时候,会将sync传递到WriteLock内,WirteLock的操作是基于sync(AQS)实现的;写锁在加锁时,需要注意:...原创 2022-07-01 00:31:00 · 136 阅读 · 0 评论 -
JUC——FutureTask
在使用多线程的场景中,线程A如何想要获取线程B的执行结果,则需要一直等待线程B执行完毕后才能取到结果,而Future则是线程A在提交线程B时,返回一个Future,线程A通过调用Future.get获取线程B的结果,如果此时线程B还未执行完毕,则线程A调用Future.get会阻塞;Future是一个接口,其中FutureTask是Future的一种实现;2. FutureTask状态FutureTask状态流转4. run方法FutureTask实现自RunnableFuture,而Runnab原创 2022-06-28 23:48:44 · 168 阅读 · 0 评论 -
JUC——CopyOnWriteArrayList
CopyOnWriteArrayList是java为了解决ArrayList并发容器提供的工具类,它通过对写操作加锁串行处理,当写操作在进行时,也不影响读操作;每次写操作都会复制一个副本出来,在副本没有指定真正的array引用之前,读请求可能会读到旧的数据,所以它比较适合读多写少,并且能够容忍最终一致性的问题;Arrays.copyOf也是复制一份数组,它的内部实现也是基础System.arraycopy来实现的,System.arraycopy也是一种浅拷贝;接下来做一个小实验:说明System.ar原创 2022-06-28 20:07:19 · 175 阅读 · 0 评论 -
JUC——CyclicBarrier
CyclicBarrier也是一个多线程通信工具,它支持一组线程都到达一个点之后再继续执行;它的内部实现是通过ReentrantLock和Condition来实现的,接下来看一下它的源码分析;// 可重入锁private final ReentrantLock lock = new ReentrantLock();// 条件队列private final Condition trip = lock.newCondition();// 参与的线程数量,它的值不会改变,当循环使用CyclicBarrie原创 2022-06-27 15:55:58 · 123 阅读 · 0 评论 -
JUC——Semaphore
Semaphore信号量也是基于AQS共享模式来实现的,通过AQS的state完成计数器,它可以用来保护一个或多个共享资源的访问,如果state>0则允许获取资源,否则阻塞等待;Semaphore支持公平式和非公平式抢占,默认为非公平式抢占,在创建Semaphore时,通过:Semaphore主要的方法 :获取许可释放许可从上面的源码中可以看出,在释放许可的时候,并没有做太多的限制,那如果acquire一次,release两次会有什么后果呢?获取许可...原创 2022-06-27 00:25:47 · 296 阅读 · 0 评论 -
JUC——ReentrantLock
ReentrantLock是基于AQS来实现的,所以如果想对它有所了解,最好先熟悉一下AQS的内容,它继承了Lock接口,Lock接口定义了加锁释放锁的方法;ReentrantLock支持公平锁和非公平锁两种加锁方式,而不像synchronized只支持一种非公平锁;并且ReentrantLock也支持中断非中断加锁;ReentrantLock内部有三个内部类,Sync、NonfairSync、FairSync;其中FairSync是实现公平锁的子类,而NonfairSync和FairSync继承自Syn原创 2022-06-26 13:38:11 · 140 阅读 · 0 评论 -
JUC——AQS
AbstractQueuedSynchronizer是Java的并发基础,想学好Java的并发,还需要先从AQS开始学起,本节参考网络知识,学习AQS的实现原理;AQS是CLH锁的一个变种,了解CLH原理对学习AQS有一定理解上的帮助,CLH队列属于自旋锁的一种,先来看一下CLH队列锁的特点:参考网络中对CLH队列锁的一种实现:上述代码中使用到了ThreadLocal,可以方便的在加锁时将当前Node存放ThreadLocal,在释放锁时,只需要从ThreadLocal获取当前线程绑定的节点;通过图解的方原创 2022-06-25 17:54:53 · 190 阅读 · 0 评论 -
JUC——LockSupport & Condition
LockSupport和Condition功能和wait/notify类似,都可以完成线程阻塞唤醒或线程通信的功能;其中LockSupport的park和unpark(thread)可以随时随地使用,不需要像wait/notify必须在synchronized中使用;在JUC并发包中也大量的使用LockSupport的功能;本文主要介绍LockSupport和Condition功能和区别;LockSupport 工具可以帮助我们阻塞或唤醒一个线程,也是构建同步组件的基础工具,提供park(阻塞)和unpa原创 2022-06-18 20:07:07 · 349 阅读 · 0 评论 -
JUC——CAS
在多线程编程时,如果想保证一段代码具有原子性,通过会使用锁来解决,而CAS是通过硬件指令来达到比较并交换的过程;CAS原理2 CAS存在的问题2.1 ABA问题在多线程并发场景下:线程A、B、C 同时对资源 R=1进行修改,线程A期望将R修改为2,在修改之前,线程B拿到CPU资源将R修改为3,线程B结束后,线程C拿到CPU资源将R修改为1,此时线程A接着去做修改,成功了,在线程A看来,R=1一直没有被修改,所以造成ABA问题;通过控制线程执行顺序,复现此问题,但是我们发现如果是对于数值类型的ABA问原创 2022-06-18 20:06:29 · 131 阅读 · 0 评论 -
Git在工作中常用的几个案例
1. 设置本地关联远程代码库2. 更新远程分支列表3. 删除本地及远程分支4. 删除远程分支的目录/文件5. 分支合并6. 本地A分支提到远程B分支7. 处理代码冲突8. 本地dev改动了太多文件,但现在需要紧急切换hotfix分支修复bug9. 放弃本地代码的修改10. 撤回add的文件11. 删除已经commit的文件12. 远端代码回滚1. 设置本地关联远程代码库 git remote add origin https://git.xxx.com/demo.git2. 更新远程分支列表 g.原创 2020-11-18 15:13:23 · 418 阅读 · 0 评论 -
深入理解volatile关键字
关于volatile关键字的话,工作中没有遇到使用场景,大部分是面试的时候必问的一个题目;本文主要内容摘自《JAVA高并发编程详解》1. CPU Cache模型CPU Cache主要是为了解决CPU与内存之间访问速度的差异问题,Cache则是在程序运行的过程中会将运算的所需数据从主内存复制一份到CPU Cache中,这样CPU在计算的过程中,可以直接从CPU Cache中读取或写入,当运算结束之后,CPU Cache再将最新数据刷新到主内存当中,CPU直接通过访问Cache的方式替代直接访问主存的.原创 2020-11-07 15:08:38 · 671 阅读 · 0 评论 -
ThreadLocal父子线程值传递问题
父子线程值传递在项目中使用的场景还是非常多的,比如APM系统都有类似的需求;分布式系统中做链路追踪时,就会遇到线程A创建一个线程B时,无法追踪到线程B的执行过程;这里列举一下常见的解决思路:1. InheritableThreadLocal...原创 2020-08-20 12:26:22 · 1292 阅读 · 1 评论 -
ThreadLocal 深入原理分析
对于java程序员来说,ThreadLocal多少都在项目中有用到过(比如分页查询、用户信息传递等),今天来一起来剖析一下它的原理;1. ThreadLocal的使用这些给出一个小Demo:@Testpublic void testThreadLocal() throws InterruptedException { final ThreadLocal<String> threadLocal = new ThreadLocal<>(); threadLocal原创 2020-08-19 11:31:23 · 251 阅读 · 0 评论 -
Linux中常用的几个性能分析命令
这里记录几个Linux性能分析命令(不含每项参数的说明),方便生产环境出问题快速排查(有时候命令总是忘);1. psps命令用于查看进程的运行状态;常用方式:ps -ef | grep java 查看java服务的详细信息;ps -aux --sort -pcpu | less 根据 CPU 占用量降序排序;ps -aux --sort -pcpu,+pmem | head -n 10 按CPU降序,内存升序排序,并只展示前10行; ps -axjf 或者 p原创 2020-08-09 21:01:48 · 1100 阅读 · 0 评论 -
if...else代码优化
在编码中难免遇到if else过多情况,一方面是当初设计没有在意,另一方面可能是因为需求的不断变化。但代码中出现大量if else都知道这种情况不太好,那么我们就聊一下这种情况应该如何优化if(条件1){ ....}else if(条件2){ ....}else if(条件3){ ....}else{ ....}1.表驱动表驱动是指用查表的方式获取值private static Map<Status, Function<Integer, In原创 2020-07-31 00:02:02 · 115 阅读 · 0 评论 -
浅谈Linux Ext文件系统
首先请读者思考一个问题:Linux系统下面这么多的文件是如何来管理的?新建一个文件都是经历了什么样的过程?1.Ext文件系统的特点1).文件系统的特点权限与属性放置到inode中,至于实际数据则放置到data block块中。还有一个超级块super block会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等;super block:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量以及文件系统的格式与相关信息等;inode:记录文件的.原创 2020-07-24 19:16:59 · 263 阅读 · 0 评论 -
Mybatis自定义插件及案例代码
相信工作中用mybatis的同学大部分都使用过PageHelper分布插件,最近也是想了解一下PageHelper的实现原理,PageHelper也是通过mybatis的插件来实现的。具体怎么去实现一个mybatis插件下面做具体的介绍。1.mybatis插件机制工作中遇到过一个场景,打印mybatis的执行sql日志到公司日志平台。那么就需要自定义mybatis插件来实现,在执行sql之前,希望能够拦截到mybatis的执行sql,然后使用公司的日志框架打印日志。myba支持拦截的方法:Para原创 2020-07-04 10:45:08 · 397 阅读 · 0 评论 -
linux运维工具nc
Netcat被称为tcp/ip最好用的工具,也是linux开发/运维人员的必备技巧;1.安装ncyum install nc -y2.常用功能2.1 端口测试查看服务器的某个端口是否开启nc -vz ip portnc -vz 192.168.1.1 80-v:显示多点信息-z:不发送数据例如:端口范围扫描nc -v -v -w3 -z 192.168.1.1 80-88两次-v显示更详细的内容;-w3:设置扫描超时时间 3秒;2.2 传输测试192.16.原创 2020-06-20 13:38:46 · 411 阅读 · 0 评论 -
Shell实用案例
这里主要记录一下工作中遇到的一些常用shell1.jenkins部署远程tomcat#/bin/bashexport TOMCAT_HOME_PATH=/usr/local/soft/tomcat-8.5.53cd $TOMCAT_HOME_PATH#停服;pid=`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'``kill -9 $pid`#备份war包date_now=`date '+%Y%m%d%H%M%S'``cp.原创 2020-06-20 13:35:10 · 354 阅读 · 0 评论 -
线程池大小如何调?
在项目中经常使用到多线程来提升业务处理速度,但线程池的大小该定义为多大,这块该怎么确定?1.IO密集型单核心最佳线程数=1+(IO耗时/CPU耗时)多核心线程数星佳线程数=CPU核数*(1+(IO耗时/CPU耗时))注:如何获取CPU耗时和IO耗时,可以通过APM之类系统2.CPU密集型最佳线程数=CPU核数+1说明一下这个1哪来的,是为了防止突然有线程出现内存页失效或者其它原因导致阻塞;3.总结在真正生产中,肯定不是这么配置的,为什么?生产应用一般CPU使用率达到7原创 2020-06-13 10:20:40 · 241 阅读 · 0 评论 -
java中的CAS乐观锁
最近,总是听到同事在面试的时候问候选人java中的锁相关的知识,大部分同学在问到CAS的时候会有些一知半解;1. 原子操作说到原子操作,会想到数据库事务中的原子性,道理都差不多,指一行或多行代码要么都执行成功或失败。比如:i++这行代码,在执行的过程中会分为三步去执行:1.取出i的值;2.将i的值+1;3.将+1后的赋值给i;在单线程的情况下,这种操作不会有问题,但是多线程的情况下呢:出现了线程B的结果将线程A的结果覆盖的情况;那就可以说i++不是原子操作;可以本地验证下是不是这.原创 2020-06-08 22:30:01 · 136 阅读 · 0 评论 -
你必须了解的HashMap知识总结
HashMap几乎是面试必问的知识,对于HashMap面试是你真的能从容面对吗?相信如果你去面试知名互联网公司的时候,决对不会只是问问你HashMap的数据结构这么简单的问题。我收集了最近老大在面试过程中关于HashMap常问的几个问题:1. 为什么HashMap是2的幂次方?new HashMap(14);HashMap是由数组+链表(1.8还有红黑树)来实现的,那么上面这行代码它执行后,创建的数组大小是多少呢?追踪源码可以看到它会执行这样一个函数来返回数组大小的:static final i原创 2020-06-07 17:29:47 · 223 阅读 · 0 评论 -
快速排序—最常用的排序算法
快速排序算法是冒泡排序的一种改进,快速排序也是通过逐渐消除待排序的无序序列中逆序元素来实现排序的算法思想:(1) 我们从待排序的记录序列中选取一个记录(通常第一个)作为基准元素(称为key)key=arr[left],然后设置两个变量,left指向数列的最左部,right指向数据的最右部。(2) key首先与arr[right]进行比较,如果arr[right]<key,则arr[left]=arr[right]将这个比key小的数放到左边去,如果arr[right]>key则我们只原创 2020-06-06 22:02:16 · 203 阅读 · 2 评论 -
冒泡排序—冒泡排序算法优化
常用的排序算法主要包括:1、插入排序 直接插入排序 希尔排序2、交换排序 冒泡排序 快速排序3、选择排序 简单选择排序 堆排序 快速排序 4、归并排序其中,冒泡排序算是最简单的一种排序算法排序思想:对一组数字进行从小到大或者从大到小的进行排序。它是通过让相邻的两个元素进行比较,大的元素向下沉,小的元素向上冒arr[0]与arr[1]进行比较,如果前者大于后者,则交换位置然后arr[1]与arr[2]进行比较,以此类推。当进行到n-1轮后,排序完成。原创 2020-06-06 21:39:40 · 497 阅读 · 0 评论