JDK

Java工程师需要会什么?岗位要求

老子叫甜甜 提交于 2020-12-12 14:52:45
  IT行业作为新兴行业近几年无论是从就业难度还是岗位待遇都是各行的领头羊,Java工程师在这其中占很大部分,成为一个Java工程师需要掌握什么技能呢?   1.CoreJava,就是Java基础、JDK的类库,很多童鞋都会说,JDK我懂,但是懂还不足够,知其然还要知其所以然,JDK的源代码写的非常好,要经常查看,对使用频繁的类,比如String,集合类(List,Map,Set)等数据结构要知道它们的实现,不同的集合类有什么区别,然后才能知道在一个具体的场合下使用哪个集合类更适合、更高效,这些内容直接看源代码就OK了。   2.多线程并发编程,现在并发几乎是写服务端程序必须的技术,那对Java中的多线程就要有足够的熟悉,包括对象锁机制、synchronized关键字,concurrent包都要非常熟悉,这部分推荐你看看《Java并发编程实践》这本书,讲解的很详细。   3.I/O,Socket编程,首先要熟悉Java中Socket编程,以及I/O包,再深入下去就是JavaNIO,再深入下去是操作系统底层的Socket实现,了解Windows和Linux中是怎么实现socket的。   4.JVM的一些知识,不需要熟悉,但是需要了解,这是Java的本质,可以说是Java的母体,了解之后眼界会更宽阔,比如Java内存模型(会对理解Java锁、多线程有帮助)、字节码、JVM的模型

一次 HashSet 所引起的并发问题

不打扰是莪最后的温柔 提交于 2020-12-12 14:36:22
背景 上午刚到公司,准备开始一天的摸鱼之旅时突然收到了一封监控中心的邮件。 心中暗道不好,因为监控系统从来不会告诉我应用完美无 bug,其实系统挺猥琐。 打开邮件一看,果然告知我有一个应用的线程池队列达到阈值触发了报警。 由于这个应用出问题非常影响用户体验;于是立马让运维保留现场 dump 线程和内存同时重启应用,还好重启之后恢复正常。于是开始着手排查问题。 分析 首先了解下这个应用大概是做什么的。 简单来说就是从 MQ 中取出数据然后丢到后面的业务线程池中做具体的业务处理。 而报警的队列正好就是这个线程池的队列。 跟踪代码发现构建线程池的方式如下: ThreadPoolExecutor executor = new ThreadPoolExecutor ( coreSize , maxSize , 0L , TimeUnit . MILLISECONDS , new LinkedBlockingQueue < Runnable >());; put ( poolName , executor ); 采用的是默认的 LinkedBlockingQueue 并没有指定大小(这也是个坑),于是这个队列的默认大小为 Integer.MAX_VALUE。 由于应用已经重启,只能从仅存的线程快照和内存快照进行分析。 内存分析 先利用 MAT 分析了内存,的到了如下报告。

ForkJoin

纵饮孤独 提交于 2020-12-12 10:00:50
Java Fork/Join 框架 jdk1.8-ForkJoin框架剖析 Java的Fork/Join任务,你写对了吗? 概述 从JDK1.7开始,Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果。 这种思想和MapReduce很像(input --> split --> map --> reduce --> output) 主要有两步: 第一、任务切分; 第二、结果合并 它的模型大致是这样的:线程池中的每个线程都有自己的工作队列(PS:这一点和ThreadPoolExecutor不同,ThreadPoolExecutor是所有线程公用一个工作队列,所有线程都从这个工作队列中取任务),当自己队列中的任务都完成以后,会从其它线程的工作队列中偷一个任务执行,这样可以充分利用资源。 工作窃取(work-stealing) 工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。工作窃取的运行流程图如下: 那么为什么需要使用工作窃取算法呢? 假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,于是把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应

mybatis之动态代理

China☆狼群 提交于 2020-12-12 09:39:06
mybatis之动态代理的应用 在前文(https://www.cnblogs.com/NYfor2018/p/9093472.html)我们知道了,Mybatis的使用需要用到Mapper映射文件,一个是映射接口,另一个是映射XML文件(此处不详谈映射文件XML),在应用中我们可以感觉到,映射接口似乎对接着XML文件中的实现命令,可是我们在运行程序是时候调用的往往是Mapper接口,而不是一个包含逻辑的实现类。很显然Mapper产生了代理类。 首先,什么是代理模式? 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 (取自百度百科: https://baike.baidu.com/item/%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/8374046?fr=aladdin ) 举个栗子,如图: 我们租房的时候一般是去找中介,而不是直接去找包租婆。放在代理模式这里来说,就是,我们在访问真实的对象的时候,往往不是直接去访问真实对象,而是通过代理对象,来对真实对象进行访问。 为什么要使用代理模式? 通过代理,一方面可以控制如何访问真正的服务对象,提供额外的服务。另外一方面有机会通过重写一些类来满足特定的需要。 就像是

idea 创建多模块依赖Maven项目

江枫思渺然 提交于 2020-12-12 07:32:54
1. 创建一个新maven项目 2. 3. 输入groupid和artifactid,后面步骤直接next,最后finish 4.创建好后 5. 在主项目名称上点右键,创建第一个子模块 6 7 8 同理,在创建一个模块,创建好后 9 打开Project Structure将2个子模块的src/mian/java目录设置为Sources,只有设置为sources了,后面才能创建Class. 现在最新的IDEA已经把Java等设置为source了。可以不再设置 10 设置项目中childmoduletwo依赖于childmoduleone (另外,在pom文件中dependency 中可以把其他模块放进去,也是可以达到达到静态编译和运行通过目的的) 11 12 前面设置后,只是为了再调用依赖代码时静态编译通过,也就是说仅仅是在写代码时,childmoduletwo调用childmoduleone不提示错误,实际运行时会出错的。 所以还需要在pom文件设置依赖。 13 childmoduleone中创建一个类One,写一个个测试方法,后面会被childmoduletwo调用 14 childmoduletwo中写一个类Two,用来调用One中的sayHello方法 15 运行Two 摘自:https://www.cnblogs.com/tibit/p/6185704.html

《2019面向对象程序设计(java)课程学习进度条》

只谈情不闲聊 提交于 2020-12-12 07:18:16
学习资源 1.教材P28-P76 2.第3章教学课件3.1-3.8 3.corejava.zip中第3章示例程序3-1—3-5 4.Eclipse简明教程.pdf 5.MOOC & 视频:浙江大学 翁恺老师:零基础学java 1.2-1.3、2.1-2.4、3.1-3.2、4.1-4.3、6.1-6.3 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 第一周 70/10 1/1 6 JDK、eclipse的安装、九九乘法表的编译 第二周 90/40 2/1 8 数据类型的总结,第三章实验四、实验五、实验六 第四周   200/60 1/0 10 掌握类与对象的基础概念,理解类与对象的关系; 2. 掌握对象与对象变量的关系; 3. 掌握预定义类Date、LocalDate类的常用API; 4. 掌握用户自定义类的语法规则,包括实例域、静态域、构造器方法、更改器方法、访问器方法、静态方法、main方法、方法参数的定义要求;(重点、难点) 5. 掌握对象的构造方法、定义方法及使用 6. 理解重载概念及用法; 掌握包的概念及用法 第六到七周 526/62 1/0 12 1.深入理解程序设计中算法与程序的关系; 2.深入理解java程序设计中类与对象的关系; 3.理解OO程序设计的第2个特征:继承、多态; 4

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方案

心不动则不痛 提交于 2020-12-12 06:56:12
  导入commons-logging-1.2.jar辅助类包即可。 报错提示: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/ LogFactory at org.springframework.jdbc.support.JdbcAccessor. <init>(JdbcAccessor.java:43 ) at org.springframework.jdbc.core.JdbcTemplate. <init>(JdbcTemplate.java:164 ) at DemoJDBCTemplate.Templatedemo1.main(Templatedemo1.java: 13 ) Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory at java.base /jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582 ) at java.base /jdk.internal.loader.ClassLoaders$AppClassLoader

CentOS7安装CDH 第四章:CDH的版本选择和安装方式

百般思念 提交于 2020-12-12 06:42:34
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 CentOS7安装CDH 第四章:CDH的版本选择和安装方式 CentOS7安装CDH 第五章:CDH的安装和部署-CDH5.7.0 CentOS7安装CDH 第六章:CDH的管理-CDH5.12 CentOS7安装CDH 第七章:CDH集群Hadoop的HA配置 CentOS7安装CDH 第八章:CDH中对服务和机器的添加与删除操作 CentOS7安装CDH 第九章:CDH中安装Kafka CentOS7安装CDH 第十章:CDH中安装Spark2 CentOS7安装CDH 第十一章:离线升级CDH版本 CentOS7安装CDH 第十二章:YARN的资源调优 CentOS7安装CDH 第十三章:CDH资源池配置 CentOS7安装CDH 第十四章:CDH的优化 1. CDH版本选择 CDH版本选择:建议5.4.8和5.8.0版本,如需要版本较高可以选择5.12版本,目前6.x版本还没有使用过,请注意,千万不要选择5.11.0版本。 在CDH5版本中,JDK一般安装为JDK8,还需要安装python环境,可以选择python2.6.X或者python2.7.x都可以。 2.

【计算机基础】在0和1的世界里来来回回

痴心易碎 提交于 2020-12-12 01:43:41
事物的正反两面被哲学家讨论了几千年。计算机里的0和1也照旧玩出了各种花样。 二进制数 VS 十进制数 本小节讲二进制写法,以及到十进制的转换方法,如果已熟悉这些内容可以 直接跳到下一小节 。 我们生活在一个十进制的世界中。10个一毛就是一块,10个一两就是一斤。在数学上有满十进一或借一当十。 十进制数的基数就是0到9,因此所有的十进制数都是由0到9这九个数字组合出来的。 计算机底层处理的都是二进制数,可以对比十进制数来看看二进制数的特点: 满二进一或借一当二,基数是0和1,就是说所有的二进制数都是由0和1这两个数字组合出来的。 就十进制而言,十个1已经达到“满十”的条件,所以要“进一”,于是就是10,这是个十进制数,它的值就是十,因为是十个1合在了一起。 就二进制而言,两个1已经达到“满二”的条件,所以要“进一”,于是就是10,这是个二进制数,它的值就是二,因为是两个1合在了一起。 如果刚刚这个明白了,结合十进制和二进制的特点,接下来就非常容易理解了: 1 + 1 = 2 -> 10。 1 + 1 + 1 = 3 = 2 + 1 -> 10 + 1 -> 11。 1 + 1 + 1 + 1 = 4 = 3 + 1 -> 11 + 1 -> 100。 照此类推,列出几个十进制和对应的二进制: 0 -> 000 1 -> 001 2 -> 010 3 -> 011 4 -> 100 5

动态高并发时为什么推荐ReentrantLock而不是Synchronized?

跟風遠走 提交于 2020-12-11 22:38:09
前言碎语 Synchronized 和 ReentrantLock 大家应该都不陌生了,作为java中最常用的本地锁,最初版本中 ReentrantLock 的性能是远远强于 Synchronized 的,后续java在一次次的版本迭代中 对 Synchronized 进行了大量的优化,直到 jdk1.6 之后,两种锁的性能已经相差无几,甚至 Synchronized 的自动释放锁会更好用。 在面试时被问到 Synchronized 和 ReentrantLock 的使用选择时,很多朋友都脱口而出的说用 Synchronized ,甚至在我面试的时候问面试者,也很少有人能够答出所以然来,moon 想说,这可不一定, 只对标题感兴趣的同学可以直接划到最后 ,我可不是标题党~ Synchronized使用 在 java 代码中 synchronized 的使用 是非常简单的 1.直接贴在方法上 2.贴在代码块儿上 程序运行期间,Synchronized那一块儿代码发生么什么? 来看一张图 在多线程运行过程中, 线程会去先抢对象的监视器 ,这个监视器是对象独有的,其实就相当于一把钥匙,抢到了,那你就获得了当前代码块儿的执行权。 其他没有抢到的线程会进入队列(SynchronizedQueue)当中等待,等待当前线程执行完后,释放锁. 最后当前线程执行完毕后通知出队然后继续重复当前过程.