
Java
文章平均质量分 88
yi博说
知识能改变命运么?
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java9、10、11的新特性
Java 9Java 9 提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的 REPL 工具,jshell,JDK 编译工具,Java 公共 API 和私有代码,以及安 全增强、扩展提升、性能管理改善等,下面介绍一些常用新特性。1. JDK 目录结构的改变JDK1.8及以前的目录JDK1.9目录2. 模块化系统Java 已经 发展超过 20 年(95 年最初发布),Java 和相关生态在不断丰富的同时也越来越暴露出一些问题:Java 运行环境的膨胀和臃肿,每次JVM启动的原创 2021-06-14 22:03:25 · 1545 阅读 · 0 评论 -
处理 Exception 的几种实践,很优雅,被很多团队采纳!
在Java中处理异常并不是一个简单的事情。不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样处理等等。这也是绝大多数开发团队都会制定一些规则来规范对异常处理的原因。而团队之间的这些规范往往是截然不同的。本文给出几个被很多团队使用的异常处理最佳实践。实践在Finally块中清理资源或者使用try-with-resource语句当使用类似InputStream这种需要使用后关闭的资源时,一个常见的错误就是在try块的最后关闭资源。public转载 2021-03-25 10:17:46 · 148 阅读 · 0 评论 -
特好用!!!8种分布式ID生成方法
前言业务量小于500W或数据容量小于2G的时候单独一个mysql即可提供服务,再大点的时候就进行读写分离也可以应付过来。但当主从同步也扛不住的时候就需要分表分库了,但分库分表后需要有一个唯一ID来标识一条数据,且这个唯一ID还必须有规则,能辅助我们解决分库分表的一些问题。数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的,那么这个全局唯一ID就叫分布式ID。分布式ID需满足那些条件全局唯一:基本要求就是必须保证ID是全转载 2021-01-26 09:02:07 · 509 阅读 · 0 评论 -
女朋友也能看懂的Zookeeper分布式锁原理
介绍许多场景中,数据一致性是一个比较重要的话题,在单机环境中,我们可以通过Java提供的并发API来解决;而在分布式环境(会遇到网络故障、消息重复、消息丢失等各种问题)下要复杂得多,比如电商的库存扣减,秒杀活动,集群定时任务执行等需要进程互斥的场景。本文主要探讨如何利用Zookeeper来实现分布式锁,对比了一些其他方案分布式锁的优缺点。至于使用何种,要因自己的业务场景去决定,没有绝对的方案。分布式锁是什么?分布式锁是控制分布式系统之间同步访问共享资源的一种方式。实现分布式锁注意点:锁的可重入性原创 2021-01-22 15:34:28 · 258 阅读 · 0 评论 -
灵魂发问!线程池到底创建多少线程比较合理?
虽然线程池的模型被剖析的非常清晰,但是如何最高性能地使用线程池一直是一个令人纠结的问题,其中最主要的问题就是如何决定线程池的大小。这篇文章会以量化测试的方式分析:何种情况线程池应该使用多少线程数。计算密集型任务与IO密集型任务大多数刚接触线程池的人会认为有一个准确的值作为线程数能让线程池适用在程序的各个地方。然而大多数情况下并没有放之四海而皆准的值,很多时候我们要根据任务类型来决定线程池大小以达到最佳性能。计算密集型任务以CPU计算为主,这个过程中会涉及到一些内存数据的存取(速度明显快于IO),执行任转载 2021-01-21 17:30:13 · 1056 阅读 · 0 评论 -
为什么牛逼的程序员都不用 “ ! = null “ 做判空?
问题为了避免空指针调用,我们经常会看到这样的语句...if(someobject!=null){someobject.doCalc();}...最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?精华回答这是初、中级程序猿经常会遇到的问题。他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空。另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空。...转载 2021-01-20 14:29:55 · 158 阅读 · 0 评论 -
浅谈Mybatis的一级缓存和二级缓存
MyBatis的缓存机制缓存的引入当我们大量执行重复的查询SQL语句的时候,会频繁的和数据库进行通信,会增加查询时间等影响用户体验的问题,可以通过缓存,以降低网络流量,使网站加载速度更快.MyBatis的一级缓存默认情况下,MyBatis只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。这也就是大家常说的MyBatis一级缓存,一级缓存的作用域是SqlSession。第1种情况:同个session进行两次相同查询代码验证 //测试一级缓存 @Test转载 2020-11-24 14:06:49 · 1138 阅读 · 0 评论 -
ThreadPoolExecutor最佳实践--如何选择线程数
去年的一篇《ThreadPoolExecutor详解》大致讲了ThreadPoolExecutor内部的代码实现。总结一下,主要有以下四点:当有任务提交的时候,会创建核心线程去执行任务(即使有核心线程空闲仍会创建); 当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队; 当BlockingQueue满了(offer失败),就会创建临时线程(临时...转载 2020-01-20 13:58:25 · 1528 阅读 · 0 评论 -
Maven依赖详解
本篇目标:通过讲解maven依赖范围、传递性依赖、可选依赖、依赖调节,让大家知道maven依赖的正确使用姿势是什么。什么是依赖范围Java在进行代码编译和运行的时候都分别需要指定classpath路径,不然将会出现找不到对应的类。同样的maven默认提供了编译主代码时、测试代码时、运行时的3套classpath。而依赖范围就是用来控制该jar应该被引入哪一个classpath中,maven...原创 2019-06-09 19:40:04 · 742 阅读 · 0 评论 -
ThreadPoolExecutor入门级
是什么JUC包下提供的一个线程池工具类。它帮我们解决了2个主要问题:当需要执行大量异步任务的时候合理、有效的复用线程资源,防止多个任务创建多个线程资源。能够有效限制和管理线程资源,比如控制初始化线程的数量,动态新增线程数等。实现原理本篇我们主要围绕它的核心设计思想讲解,不追踪源码。JUC包下提供了Excutors工厂类,让我们快速便捷的实例化ThreadPoolExecutor,但更...原创 2019-05-06 13:59:33 · 558 阅读 · 0 评论 -
ReentrantLock入门级
是什么synchronized关键词功能一致,让线程保持同步。synchronized是基于Java语法上的实现,而ReentrantLock是基于API实现,操作上相对灵活。JDK1.7 之后 两者的性能上不分秋色。ReentrantLock实现了Lock接口,我们来看看那Lock几个主要接口定义:/**当前线程尝试获取独占锁,如果发现锁已被其他线程占用将被挂起。**/void loc...原创 2019-04-18 20:30:10 · 583 阅读 · 0 评论 -
ReentrantReadWriteLock入门级
是什么解决线程安全我们用ReentrantLock就可以了,但是对于读多写少的情况下我们继续使用它会有损性能,因为在没有写但有持续读数据的情况下,加锁是没有必要的,所以ReentrantReadWriteLock为了解决这个问题应运而生,它满足这样的规则:读读共享、读写互斥、写写互斥。更进一步的解释,它内部维护了两种锁即写锁和读锁。在没有线程获取写锁的时候,多个线程可以同时获取读锁。如果有线程获...原创 2019-04-22 16:09:18 · 488 阅读 · 0 评论 -
LockSupport工具类-入门级
是什么LockSupport 是JDK内部提供阻塞和唤醒线程的工具类。void park()方法如果线程未获得许可证的前提下,调用了park方法将进行阻塞,否则不会阻塞直接返回。void unpark(Thread thread) 方法当某线程调用unpark(Thread thread) 方法时,传入方法中对应的线程将会获得许可证。void parkNanos(lo...原创 2019-04-14 16:12:30 · 322 阅读 · 0 评论 -
(5)并发编程高级篇-AtomicLong、LongAdder、LongAccumlator
Java的JUC包下提供了很多的原子性操作类,都是通过非阻塞的CAS操作来实现的,相比于用锁的方式来实现原子性操作上性能有较大的提升,本篇主要着重讲解简单的AtomicLong类以及JDK1.8新增的LongAdder、LongAccumulator类,至于其他的类都大同小异,明白其原理去理解其他的并不难。AtomicLong类原子性操作类的底层都是用Unsafe类进行实现的,我们看下面的At...原创 2019-02-21 11:21:32 · 689 阅读 · 0 评论 -
减少if else 语句使用的个人集锦
是否你有过这样的体验:天天写着if (){...if(){..}}else{...}的代码,天天脑海里一直模拟的程序的运行场景。如果是那请看下面文章:↓if语句的第一个问题在于,通常出现if语句的代码很容易越改越糟。我们试着写个新的if语句:public void theProblem(boolean someCondition) { // SharedState原创 2016-11-11 15:08:32 · 602 阅读 · 0 评论 -
Java泛型上界通配符 和下界通配符 的区别
题主说的<? extends T>和<? super T>是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。<? extends T>:是指 “上界通配符(Upper Bounds Wildcards)” <? super T>:是指 “下界通配符(Lower Bounds Wildcards)”1. 为什么...转载 2018-08-17 14:57:12 · 1956 阅读 · 0 评论 -
AQS结构及原理分析
AQS介绍AQS,即AbstractQueuedSynchronizer, 队列同步器,它是Java并发用来构建锁和其他同步组件的基础框架。来看下同步组件对AQS的使用:AQS是一个抽象类,主是是以继承的方式使用。AQS本身是没有实现任何同步接口的,它仅仅只是定义了同步状态的获取和释放的方法来供自定义的同步组件的使用。从图中可以看出,在java的同步组件中,AQS的子类(Sync等)一...转载 2018-09-06 17:29:31 · 406 阅读 · 0 评论 -
(6)并发编程高级篇-CopyOnWriteArrayList
介绍java并发包中的并发List只有CopyOnWriteArrayList,CopyOnWriteArrayList的修改操作底层都是通过拷贝一份数组进行的。使用ReentrantLock独占锁来保证多线程并发下只有一个线程进行修改操作,下面我们通过源码分析来逐步了解。初始化方法 /** * Creates an empty list. */ public...原创 2019-02-21 16:02:47 · 1225 阅读 · 0 评论 -
(1)Java并发编程基础篇
什么是线程CPU调度的最基本单位。线程创建与运行线程的创建有三种方式 通过继承Thread类覆盖run方法 实现runnable接口 实现Callable接口,此方式能够获取任务执行完毕的返回结果 线程通知与等待 wait方法 当一个线程调用共享变量的wait函数时,该线程会阻塞挂起并释放共享变量的锁. 线程的唤醒需由其他线程通过调用共享变量...原创 2019-02-19 10:02:14 · 529 阅读 · 0 评论 -
(2)Java并发编程基础篇
什么是多线程并发编程并发指在同一时间段内多个任务执行,而并行指单位时间内多个任务执行。同一时间段内由多个单位时间组成,所以并发的多个任务不一定在单位时间内同时执行。并发强调的是同一时间段。为什么要进行多线程并发编程多核CPU时代的到来有效解决了单核CPU的困扰,线程各自使用自己的CPU运行,减少了线程上下文切换的资源开销,但随着大数据时代的来临,系统逐渐对性能和吞吐的要求提高,需要对高并发编...原创 2019-02-19 15:33:06 · 616 阅读 · 1 评论 -
(3)Java并发编程基础篇
乐观锁与悲观锁乐观锁和悲观锁是在数据库中引入的名词,在java的并发包锁中也有类似的概念所以这边我们也有必要提及以下。悲观锁悲观锁指在外界对数据进行修改的时候,它都持悲观的态度,认为数据都会被其他人进行修改,所以在获取、修改记录之前都会对记录进行加锁操作。下面看一个典型的例子:public void updateAction(Integer id){## 开启事务line1 : T...原创 2019-02-20 11:49:11 · 515 阅读 · 0 评论 -
(4)Java并发编程高级篇-ThreadLocalRandom类
ThreadLocalRandom 类Random 类的局限性每个Random实例中都存有一个原子性的种子变量,每当获取随机数时会根据当前种子变量的值计算出新的种子变量。在多线程的情况下,操作单个Random实例时,多个线程会同时竞争原子性种子变量的更新操作,且只能有一个成功。未成功的线程将会执行自旋操作继续尝试。在高并发的场景下,这种方式有损性能,所以ThreadLocalRandom应运而...原创 2019-02-20 15:42:11 · 610 阅读 · 0 评论