Java构造函数,构造代码块,静态代码块的执行时间publicclassConstructor{publicstaticvoidmain(String[]args){System.out.println("创建第一个对象:");Testtest1newTest();System.out.println("");System.out.println("创建第二个对象:");Testtest2newTest(5);}}classTest{静态代码块1static{System.out.println("我是静态代码块1");}构造代码块1:{System.out.println("我是构造代码块1");}构造函数1publicTest(){System.ou...
2023-11-09 11:56:37 1987浏览 0点赞 0回复 0收藏
前言HashMap的主干是一个数组,假设我们有3个键值对dnf:1,cf:2,lol:3,每次放的时候会根据hash函数来确定这个键值对应该放在数组的哪个位置,即indexhash(key)1hash(dnf),我们将键值对放在数组下标为1的位置3hash(cf)1hash(lol),这时发现数组下标为1的位置已经有值了,我们就可以用链表的形式将这个键值对放到dnf键值对的下面在获取key为lol的键值对时,1hash(lol),得到这个键值对在数组下标为1的位置,lol和dnf不相等...
2023-11-09 11:55:50 2261浏览 0点赞 0回复 0收藏
前言JUC是java.util.concurrent包的简称,JUC有2大核心,CAS和AQS,CAS是java.util.concurrent.atomic包的基础NotThreadSafepublicclassCountTest{publicstaticintcount0;publicstaticvoidmain(String[]args){新建一个线程池ExecutorServiceserviceExecutors.newCachedThreadPool();Java8lambda表达式执行runnable接口for(inti0;i<5;i++){service.execute(()>{for(intj0;j<1000;j++){count++;}});}关闭线程池service.shutdown()...
2023-11-09 11:55:04 1495浏览 0点赞 0回复 0收藏
前言建议先看一下上一个分享:CAS实现原理JUC中的许多并发工具类ReentrantLock,CountDownLatch等的实现都依赖AbstractQueuedSynchronizerAbstractQueuedSynchronizer定义了一个锁实现的内部流程,而如何上锁和解锁则在各个子类中实现,典型的模板方法模式模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤下面举个简单...
2023-11-09 11:46:32 1685浏览 0点赞 0回复 0收藏
前言建议和上一篇分享结合着看:深入理解AbstractQueuedSynchronizer先举个例子,下面程序输出始终是5000,可以用ReentrantLock来保证线程安全ThreadSafepublicclassCountTest{publicstaticintcount0;publicstaticLocklocknewReentrantLock();publicstaticvoidmain(String[]args){ExecutorServiceserviceExecutors.newCachedThreadPool();for(inti0;i<5;i++){service.execute(()>{加锁lock.lock();try{for(intj0;j<1000...
2023-11-09 11:42:59 1584浏览 0点赞 0回复 0收藏
前言以前都是直接在项目中使用网上的log4j2.xml,大概能用就行,结果用Storm的时候,项目中的log4j2.xml文件失效,必须在Storm目录的配置文件中配置,就学习了一波,分享一下log4j2有8个级别,从低到高为ALL<TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少先看一个最简单的,log4j2.xml<xmlversion"1.0"encoding"UTF8"><Configurationstatus"WARN"><Ap...
2023-11-07 11:50:07 3098浏览 0点赞 0回复 0收藏
前言在这篇文章中对属性介绍的比较多:HashMap实现原理HashMap不是线程安全的,在多线程环境下可以使用Hashtable和ConcurrentHashMap,Hashtable实现线程安全的方式是用synchronized修饰方法,如get和put方法都是用synchronized修饰的,使用的是对象锁,这样会导致线程1get元素(或者put元素)时,线程2不能get元素和put元素,在竞争激烈的时候会出现严重的性能问题简介Hashtable出现性能问题的原因是所有访问Hashtable...
2023-11-07 11:49:09 1936浏览 0点赞 0回复 0收藏
前言建议先看一下这篇分享,深入理解AbstractQueuedSynchronizer,这篇文章主要介绍了AQS的同步队列实现,而本篇文章主要介绍AQS条件队列的实现在进行线程间的通信时,当我们使用synchronized时,可以用基于Object对象的wait和notify方法实现等待通知机制,但是在AQS相关类中怎么实现这种等待通知机制呢?答案是Condition,Condition是一个接,AbstractQueuedSynchronizer中有一个内部类实现了这个接口基于Object实现等...
2023-11-07 11:48:27 1879浏览 0点赞 0回复 0收藏
前言建议先看一下这篇分享,深入理解Condition阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入的元素,直到队列不满支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者从队列里取元素的线程。阻塞队列...
2023-11-07 11:47:44 1667浏览 0点赞 0回复 0收藏
前言有一些对象其实我们只需要一个,比方说:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序的对象。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常,资源使用过量,或者是不一致的结果涉及到一些类加载的知识,如果不清楚,可以看一下这篇分享:Java类的加载顺序单例模式确保一个类只有一个实例,并提供一个全局...
2023-11-07 11:47:09 2686浏览 0点赞 0回复 0收藏
前言设计到一部分AQS和阻塞队列的内容,可以看一下如下分享深入理解AbstractQueuedSynchronizer深入理解阻塞队列作用降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控使...
2023-11-07 11:46:41 1847浏览 0点赞 0回复 0收藏
前言线程池实现原理1addWorker实现在看addWorker方法之前,我们先看一个例子,了解一下retry的使用breakretry跳到retry处,且不再进入循环continueretry跳到retry处,且再次进入循环publicstaticvoidmain(String[]args){breakRetry();continueRetry();}privatestaticvoidbreakRetry(){inti0;retry:for(;;){System.out.println("start");for(;;){i++;if(i4)breakretry;}}start进入外层循环4System.out.println(i);}priva...
2023-11-07 11:45:27 1569浏览 0点赞 0回复 0收藏
前言Spring的IOC极大的方便了我们的编程,当我们需要某个对象的时候,不在需要自己去new,只要告诉Spring一声,Spring就会把我们所需要的类准备好,就像你原来出门要穿外套时,你得先跑到衣柜前取出衣服,然后自己穿上。现在好了,你结婚了,只要跟你的另一半说一声,她就会心领神会,把衣服给你拿过来,然后帮你穿上,是不是感觉很爽?Spring有三种配置方法,这三种配置方式如何选择?先看一下这三种配置方式XMLapplicationCon...
2023-11-07 11:44:30 1614浏览 0点赞 0回复 0收藏
前言说到数据库事务,很多人就会想事务的ACID即原子性,一致性,隔离性,持久性,以及事物的四个隔离级别,但是并不是很明白为什么要用这四个特性来保证事务,以及事务的隔离级别是怎么产生的?包括LZ之前看《高性能MySQL》关于事务的介绍也是一脸蒙蔽,因为太抽象了。偶然在慕课网上看到《在线分布式数据库原理与实践》这个视频,讲的挺不错的。特地总结一波,分享一下,相信读完本文你可以轻松理解这些概念事务简介我们在写Ja...
2023-11-07 11:43:54 1501浏览 0点赞 0回复 0收藏
前言本文是在别人的文章上加上了LZ很多的示例代码和思路写成的,并且在GitHub上写了相应的代码,本文说的思路都有体现,点击最下面原文链接里面有LZ的GitHub地址。文章原文链接:http:www.cnblogs.comLBSerp4853234.html在学校期间大家都写过不少程序,比如写个helloworld服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。publicinterfaceHelloService{publicStringsayHello(Stringco...
2023-11-07 11:42:34 2088浏览 0点赞 0回复 0收藏
前言先来看Java程序是怎么工作的我们都知道Java是跨平台的,是因为不同平台下的JVM能将字节码文件解释为本地机器指令,JVM是怎么加载字节码文件的?答案就是ClassLoader,先来打印看一下ClassLoader对象publicclassClassLoaderDemo1{publicstaticvoidmain(String[]args){nullSystem.out.println(String.class.getClassLoader());ClassLoaderloaderClassLoaderDemo1.class.getClassLoader();while(loader!null){sun.misc.Launche...
2023-11-03 10:48:24 1790浏览 0点赞 0回复 0收藏
静态工厂模式以学习为例,假如你想学习Java视频,你得自己到处去找资料,找资料是一个繁琐的过程,过一段时间你又想学Python视频了,你还得去找资料。现在你在学校上学,你想学Java视频了,你跟老师说,我想学Java视频了,老师就给了你一套Java视频,我想学Python视频了,老师就给了你一套Python视频,是不是感觉很方便,静态工厂模式就是将创建具体类的过程交给工厂类来实现publicabstractclassVideo{abstractvoidstudy();}pub...
2023-11-03 10:47:45 1951浏览 0点赞 0回复 0收藏
前言在从一堆数据中查找指定的数据时,我们常用的数据结构是哈希表和二叉查找树,表本质上就是一堆数据的集合,所以MySQL数据库用了B+树和哈希表来实现索引B+树是通过二叉查找树,再由平衡二叉树,B树(又名B树)演化而来的,B+树中的B不是代表二叉(binary),而是代表平衡(balance),因为B+树是从最早的平衡二叉树演化而来,但是B+树不是一个二叉树二叉查找树和平衡二叉树二叉查找树的效率和平衡二叉树的查找效率已经很高了...
2023-11-03 10:47:15 3789浏览 0点赞 0回复 0收藏
介绍这是一篇阐述SQLJOINs的文章,本文是国内大佬翻译的一篇文章,为了更容易理解,LZ以MySQL为例在最后面加了示例,原文链接为:https:www.cnblogs.comxufeiyangp5818571.html背景我是个不喜欢抽象的人,一图胜千言。我在网上查找了所有的关于SQLJOIN的解释,但是没有找到一篇能用图像形象描述的。有些是有图片的但是他们没有覆盖所有JOIN的例子,有些介绍实在简单空白得不能看。所以我决定写个自己的文章来介绍SQLJOINs.详细...
2023-11-03 10:46:00 2029浏览 0点赞 0回复 0收藏
介绍在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描,这些都需要通过EXPLAIN去完成。EXPLAIN命令是查看优化器如何决定执行查询的主要方法。可以帮助我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采...
2023-11-03 10:44:39 3482浏览 0点赞 0回复 0收藏