Java基础
文章平均质量分 82
HelloWorld搬运工
HelloWorld是学习程序的第一个程序,搬运工是将一件东西从一个地方运到另一个地方。HelloWorld搬运工,分享技术知识,有原创也有转发,彼此交流,一起学习,共同进步。
展开
-
isEmpty 和 isBlank 的用法区别
也许你两个都不知道,也许你除了isEmpty/isNotEmpty/isNotBlank/isBlank外,并不知道还有isAnyEmpty//isAnyBlank/的存在, come on ,让我们一起来探索这个工具类。原创 2022-10-23 08:56:56 · 178 阅读 · 0 评论 -
细数线程池的10个坑
日常开发中,为了更好管理线程资源,减少创建线程和销毁线程的资源损耗,我们会使用线程池来执行一些异步任务。但是线程池使用不当,就可能会引发生产事故。今天田螺哥跟大家聊聊线程池的10个坑。大家看完肯定会有帮助的~线程池默认使用无界队列,任务过多导致OOM线程创建过多,导致OOM共享线程池,次要逻辑拖垮主要逻辑线程池拒绝策略的坑Spring内部线程池的坑使用线程池时,没有自定义命名线程池参数设置不合理线程池异常处理的坑使用完线程池忘记关闭。原创 2022-08-22 19:17:07 · 183 阅读 · 0 评论 -
延时任务实现方案总结
# 引言在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这个延时任务和定时任务的区别究竟在哪里呢?一共有如下几点区别 定时任务有明确的触发时间,延时任务没有 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期 定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单原创 2021-08-30 19:45:23 · 618 阅读 · 1 评论 -
Java有线程安全的set吗?
在多线程环境下,要使用线程安全的集合,比如,ConcurrentHashMap是线程安全的HashMap,CopyOnWriteArrayList是线程安全的ArrayList。那么HashSet对应的线程安全集合,是什么呢?java有没有提供默认实现呢?在java的concurrent包中,我找到了CopyOnWriteArraySet,那么它是线程安全的吗?下面是测试代码。publicstaticvoidmain(String[]args){Set<Strin...原创 2021-08-30 19:41:47 · 245 阅读 · 0 评论 -
ThreadLocal的使用场景及使用方式
两大使用场景-ThreadLocal的用途典型场景1:每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random)典型场景2:每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻烦。典型场景1:每个线程需要一个独享的对象每个Thread内有自己的实例副本,不共享;举例:SimpleDateFormat。(当多个线程共用这样一个SimpleDateFormat,但是这个类是不安全的) 2..原创 2021-07-19 07:44:25 · 3799 阅读 · 1 评论 -
统计代码块耗时的小工具stopwatch
相信很多人都遇到这样一个问题?加班加点,上线了一个功能,但接口的响应时间有点长?如何定位排查?普通研发人员一般会采用下面方式,在很多位置点埋入开始时间戳、结束时间戳,相减便得到耗时。代码如下:longstart1=System.currentTimeMillis();//模拟业务逻辑处理Thread.sleep(300);longend1=System.currentTimeMillis();longstart2=System.currentTimeMilli...原创 2021-06-23 21:29:16 · 285 阅读 · 0 评论 -
SparseArray 和 HashMap区别
相同点:HashMap和SparseArray,都是用来存储Key-value类型的数据。于是同样的需要面对几个问题,hash值的计算、扩容、hash冲突、装载率过低不同点:数据结构方面:hashmap用的是链表。sparsearray用的是双数组。性能方面:hashmap是默认16个长度,会自动装箱。如果key是int 的话,hashmap要先封装成Interger。sparseArray的话就就会直接转成int。所以spaseArray用的限制是key是int。数据量小于1k。如果ke原创 2021-06-23 20:51:21 · 1571 阅读 · 0 评论 -
Java中的单链表、栈、队列三种数据结构
一、单链表1、在我们数据结构中,单链表非常重要。它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList、HashMap(数组加链表)等等的底层都是用链表实现的。2、下面是单链表的几个特点:数据元素在内存中存放的地址是不连续的:单链表的结点里面还定义一个结点,它里面保存着下一个结点的内存地址,在实例化对象的时候,jvm会开辟不同内存空间,并且是不连续的。添加效率高:添加一个元素时,先找到插入位置的前一个,只需要将1,2个.原创 2021-02-08 13:55:23 · 320 阅读 · 0 评论 -
Java并发编程之应用详解
个人博客请访问http://www.x0100.top1. 并发编程介绍1.1 并发的出现单CPU时代,单任务在一个时间点只能执行单一程序。多任务阶段,计算机能在同一时间点并行执行多进程。多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。现代的计算机多核CPU,在一个程序内部能拥有多个线程并行执行,多个CPU同时执行该程序。一个进程就包括了多个线程,每个线程负责一个独立的子任务。进程让操作...原创 2020-07-03 10:57:21 · 318 阅读 · 0 评论 -
Java并发编程之synchronized原理
个人博客请访问http://www.x0100.top1. synchronized使用1.1线程安全问题并发编程中,当多个线程同时访问同一个资源的时候,就会存在线程安全问题。由于每个线程执行的过程是不可控的,所以很可能导致最终的结果与实际期望的结果相违背或者直接导致程序出错。举例:public classVolatileTest { public int inc = 0; public void increase() { ...原创 2020-07-01 16:46:00 · 213 阅读 · 0 评论 -
Java并发编程之final应用
个人博客请访问http://www.x0100.topfinal在Java中是一个保留的关键字,可以修饰变量、方法和类。那么fianl在并发编程中有什么作用呢?本文就在对final常见应用总结基础上,讲解final并发编程中的应用。1. final基础应用final变量final变量只能被赋值一次,赋值后值不再改变。(final要求地址值不能改变)当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用...原创 2020-07-01 15:56:28 · 333 阅读 · 0 评论 -
Java并发编程之深入理解volatile
个人博客请访问http://www.x0100.top1. 保证可见性volatile保证了不同线程对volatile修饰变量进行操作时的可见性。对一个volatile变量的读,(任意线程)总是能看到对这个volatile变量最后的写入。 一个线程修改volatile变量的值时,该变量的新值会立即刷新到主内存中,这个新值对其他线程来说是立即可见的。 一个线程读取volatile变量的值时,该变量在本地内存中缓存无效,需要到主内存中读取。 举例:中断线程时常...原创 2020-07-01 15:02:07 · 211 阅读 · 1 评论 -
Java并发编程之Java内存模型详解
个人博客请访问http://www.x0100.top1. JMM抽象结构模型JMM抽象结构模型JMM定义了线程和主内存之间的抽象关系: 线程之间的共享变量存储在主内存中 每个线程都有一个私有的本地内存,本地内存中存储了该线程用以读/写共享变量的副本 共享变量:堆内存在线程之间共享,存储在堆内存中所有实例域、静态域和数组元素都是共享变量Java内存模型线程之间通信线程A与线程B通信: 线程A把本地内存A中的共享变量刷新到主内存中去。 ...原创 2020-07-01 14:12:20 · 233 阅读 · 0 评论 -
Java并发编程|重排序-可见性和有序性问题根源
个人博客请访问http://www.x0100.top并发编程的三大问题:原子性、可见性、有序性。缓存不能及时刷新导致了可见性问题。编译器为了优化性能而改变程序中语句的先后顺序,导致有序性问题。而“缓存不能及时刷新“和“编译器为了优化性能而改变程序中语句的先后顺序”都是重排序的一种。1. 重排序概念在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。从 java 源代码到最终实际执行的指令序列,会分别经历下面三种重排序: 编译器优化的重排序。编译器在...原创 2020-07-01 11:05:25 · 575 阅读 · 1 评论 -
Java并发编程之并发编程三大核心问题
个人博客请访问http://www.x0100.top写在前面编写并发程序是比较困难的,因为并发程序极易出现Bug,这些Bug有都是比较诡异的,很多都是没办法追踪,而且难以复现。要快速准确的发现并解决这些问题,首先就是要弄清并发编程的本质,并发编程要解决的是什么问题。本文将带你深入理解并发编程要解决的三大问题:原子性、可见性、有序性。补充知识硬件的发展中,一直存在一个矛盾,CPU、内存、I/O设备的速度差异。速度排序:CPU >> 内存 >> ...原创 2020-06-18 15:49:40 · 468 阅读 · 0 评论 -
Java并发编程面试题汇总
个人博客请访问http://www.x0100.top基础知识并发编程的优缺点为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升 方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力以及性能。面对复杂业务模型,并行程...原创 2020-06-16 18:03:06 · 343 阅读 · 0 评论 -
不知有多少人栽在这道简单的Java面试题上
个人博客请访问http://www.x0100.top题目很简单,完成代码,判断一个整数是否是奇数:publicbooleanisOdd(inti)相信相当数量的人都已经在准备吐槽了,只要看过《编程珠玑》的人都知道这道题的答案和其中极为简单的道理。不过别着急骂街,不管你信不信,这道笔试题我拿到的答案好多都长这样:publicbooleanisOdd(inti){if(i%2==1){System.out.println("是奇数"...原创 2020-06-05 09:15:08 · 211 阅读 · 1 评论 -
拓展并发编程思维,一个使用CountDownLatch的程序Demo
个人博客请访问http://www.x0100.topCountDownLatch是JDK提供的一个同步工具,它可以让一个或多个线程等待,一直等到其他线程中执行完成一组操作。CountDown方法和Await方法,CountDownLatch在初始化时,需要指定用给定一个整数作为计数器。当调用CountDown方法时,计数器会被减1;当调用Await方法时,如果计数器大于0时,线程会被阻塞,一直到计数器被CountDown方法减到0时,线程才会继续执行。计数器是无法重置的...原创 2020-05-25 14:56:43 · 258 阅读 · 0 评论 -
了解NIO原理机制
个人博客请访问http://www.x0100.topNIO和IO到底有什么区别?有什么关系?首先说一下核心区别: NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。 NIO不在是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又是基于这种流的形式,而是采用了通道和缓冲区的形式来进行处理数据的。 还有一点就是NIO的通道是...原创 2020-05-14 10:19:33 · 226 阅读 · 0 评论 -
反射+注解实现Entity类与Dto类相互转换
个人博客请访问http://www.x0100.top序言近期在工作中管理代码时发现,在项目中从Dao层到Service层数据传递中通过大量的get(),set()方法去一个一个的去拿值去赋值,导致代码篇幅过长,对此甚是讨厌,并且严重消耗开发时间。起初找过些关于这块的资料,现在大部分都是Entity类和Dto类的属性名相同的前提下,利用反射实现,太局限了,如果要改成同名,按目前项目的程度去整改工作量太大,不现实。后面看了Spring注解的实现,然后结合找到反射实现资料,突...原创 2020-05-09 14:23:10 · 1568 阅读 · 2 评论 -
JAVA多线程和并发基础面试
个人博客请访问http://www.x0100.top多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:非常赞同这个观点)Java多线程面试问题1. 进程和线程之间有什么不同?一个进程是一个独立(self contained)的运...原创 2020-05-06 11:26:59 · 266 阅读 · 0 评论 -
Java并发之CountDownLatch、CyclicBarrier和Semaphore
个人博客请访问http://www.x0100.topCountDownLatch是什么先看一下官方的解释:CountDownLatch:A synchronization aid that allowsone or more threads to wait until a set of operationsbeing performed in other threa...原创 2020-04-30 16:13:39 · 241 阅读 · 0 评论 -
JVM的ReentrantReadWriteLock锁了解一下
个人博客请访问http://www.x0100.top概念顾名思义,ReentrantReadWriteLock名为“可重入读写锁”,它维护两个锁:读锁和写锁。在没有写锁的情况下,读锁允许多个线程同时访问,而写锁是独占的,ReentrantReadWriteLock主要特性有以下几个: 公平性。支持公平锁和非公平锁,默认是非公平锁。非公平锁比公平锁有更高的吞吐量。 ...原创 2020-04-30 10:58:40 · 241 阅读 · 0 评论 -
比读写锁更快的锁 StampedLock
个人博客请访问http://www.x0100.top什么是读写锁读写锁:允许多个线程同时读,但是只允许一个线程写,在线程获取到写锁的时候,其他写操作和读操作都会处于阻塞状态,读锁和写锁也是互斥的,所以在读的时候是不允许写的,那如何实现一个读写锁呢?读写锁比传统的synchronized速度要快很多,原因就是在于读写锁支持读并发,而synchronized要求所有操作都...原创 2020-04-27 15:24:39 · 231 阅读 · 0 评论 -
搞懂Java 的几把 JVM 级锁
个人博客请访问http://www.x0100.top简介在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜, CPU 从单核到了多核,缓存性能也得到了很大提升,尤其是多核 CPU 技术的到来,计算机同一时刻可以处理多个任务。在硬件层面的发展带来的效率极大提升中,软件层面的多线程编程已经成为必然趋势,然而多线程编程就会引入数据安全性问题...原创 2020-04-26 18:15:59 · 742 阅读 · 0 评论 -
聊聊Java 中的 Unsafe 和 CAS
Unsafe简单讲一下这个类。Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。这个类尽管里面的方法都是public的,但是并没有办法使用它们,JDK API文档也没有提供任何关于这个类的方法的解释。总而言之,对于Unsafe类的使用都是受限制的,只有授信的代码才能获得该...原创 2020-04-21 14:39:32 · 178 阅读 · 0 评论 -
Java Semphore信号量的使用
个人博客请访问http://www.x0100.top前言:在多线程环境的同步中,我们为了让每个线程具有同步的作用,经常采用synchronize、reetrantlock等同步手段进行上锁,以便在同一时间只能有一个线程具有访问变量和读写变量的权力。然而假如实际的业务场景是允许一组线程访问(组线程数量有限),如何控制一组线程的同步,如果再采取加锁的方法就有点过犹不及了。那么此...原创 2020-04-20 07:34:28 · 392 阅读 · 0 评论 -
为什么不建议用double定义商品金额
个人博客请访问http://www.x0100.top先看现象涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子:典型现象(一):条件判断超预期System.out.println(1f==0.9999999f);//打印:falseSystem.out.println(...原创 2020-04-20 07:14:12 · 3472 阅读 · 0 评论 -
Java并发编程知识体系图表
个人博客请访问http://www.x0100.top原创 2020-04-13 22:16:32 · 357 阅读 · 0 评论 -
有没有比读写锁更快的锁?
读写锁:允许多个线程同时读,但是只允许一个线程写,在线程获取到写锁的时候,其他写操作和读操作都会处于阻塞状态,读锁和写锁也是互斥的,所以在读的时候是不允许写的,那如何实现一个读写锁呢?读写锁比传统的synchronized速度要快很多,原因就是在于读写锁支持读并发,而synchronized要求所有操作都是串行化,举个例子,我需要查询某个用户的基本信息,这些信息很少发生变化,所以我们会将这部分信息存放到缓存中,我们的查询操作为:原创 2020-04-09 07:43:52 · 197 阅读 · 0 评论 -
CAS、原子操作类的应用与浅析及Java8对其的优化
个人博客请访问http://www.x0100.top今天我们的内容是CAS以及原子操作类应用与源码浅析,还会利用CAS来完成一个单例模式,还涉及到伪共享等。因为CAS是并发框架的基石,所以相当重要,这篇博客是一个长文,请做好准备。说到CAS,不得不提到两个专业词语:悲观锁,乐观锁。我们先来看看什么是悲观锁,什么是乐观锁。悲观锁,乐观锁第一次看到悲观锁,乐观锁的时候...原创 2020-04-08 07:37:03 · 330 阅读 · 0 评论 -
什么是NIO?NIO的原理是什么机制?
个人博客请访问http://www.x0100.topNIO和IO到底有什么区别?有什么关系?首先说一下核心区别: NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。 NIO不在是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又...原创 2020-03-18 16:48:50 · 223 阅读 · 0 评论 -
并发编程中的锁原理、锁优化、CAS、AQS
个人博客请访问http://www.x0100.top1、为什么要用锁?锁-是为了解决并发操作引起的脏读、数据不一致的问题。2、锁实现的基本原理2.1、volatileJava编程语言允许线程访问共享变量, 为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。volatile在...原创 2020-03-18 16:14:50 · 233 阅读 · 0 评论 -
如何停止一个正在运行的线程
个人博客请访问http://www.x0100.top停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。在java中有以下3种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当run方法...原创 2020-03-13 14:23:47 · 1262 阅读 · 0 评论 -
常用api文档索引
个人博客请访问http://www.x0100.top常用API文档索引 API导航A Android中文版 B Bootstrap3 教程Bootstrap4 教程 C CSS 手册C 语言C++ 语言...原创 2020-03-12 16:41:21 · 339 阅读 · 0 评论 -
Netty面试题
1.Netty 是什么?Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是基于nio的,它封装了jdk的nio,让我们使用起来更加方法灵活。2.Netty 的特点是什么? 高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),...原创 2020-03-07 16:27:20 · 1108 阅读 · 0 评论 -
使用CompletableFuture高速提高程序性能
CompletableFuture相比于jdk5所提出的future概念,future在执行的时候支持异步处理,但是在回调的过程中依旧是难免会遇到需要等待的情况。在jdk8里面,出现了CompletableFuture的新概念,支持对于异步处理完成任务之后自行处理数据。当发生异常的时候也能按照自定义的逻辑来处理。如何通过使用CompletableFuture提升查询的性能呢?下...原创 2020-03-01 10:03:35 · 566 阅读 · 0 评论 -
Java 动态调试技术原理及实践
调试是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。最常用的断点调试技术会在断点位置停顿,导致应用停止响应。本文将介绍一种Java动态调试技术,希望能对大家有帮助。同时也欢迎读者朋友们一起交流,继续探索动态化调试技术。1. 动态调试要解决的问题断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应...原创 2020-02-26 20:44:49 · 510 阅读 · 0 评论 -
ReentrantReadWriteLock解析
概述 ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时Reen...原创 2019-11-05 18:16:25 · 228 阅读 · 0 评论 -
挑战10个最难回答的Java面试题
这是我收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战你的 Java 知识,但这些问题都是容易在各种 Java 面试中被问到的,而且包括我的朋友和同事在内的许多程序员都觉得很难回答。1.为什么等待和通知是在 Object 类而不是 Thread 中声明的?一...原创 2019-10-28 11:45:19 · 366 阅读 · 0 评论