JDK

线程池

对着背影说爱祢 提交于 2020-10-18 04:39:55
线程池: jdk 1.8 新增newWorkStealingPool 线程池,适合非常耗时的场景 jdk 1.8 以前 的线程池newSingleThreadPool、newFixedThreadPool、newCachedThreadPool、newScheduledThreadPool 创建线程池 ExecutorService executorService = Executors.newSingleThreadExecutor(); 用Executors 来创建 创建单核心的线程池 newSingleThreadExecutor() 创建一个无解队列的线程池,如果线程崩溃会重新创建一个,直到任务完成。 线程池参数: corePoolSize : 表示线程池核心线程数,当初始化线程池时,会创建核心线程进入等待状态,即使它是空闲的,核心线程也不会被摧毁,从而降低了任务一来时要创建新线程的时间和性能开销。 maximumPoolSize : 表示最大线程数,意味着核心线程数都被用完了,那只能重新创建新的线程来执行任务,但是前提是不能超过最大线程数量,否则该任务只能进入阻塞队列进行排队等候,直到有线程空闲了,才能继续执行任务。 keepAliveTime : 表示线程存活时间,除了核心线程外,那些被新创建出来的线程可以存活多久。意味着,这些新的线程一但完成任务,而后面都是空闲状态时

如何优雅的搞垮服务器,再优雅的救活

孤者浪人 提交于 2020-10-17 15:22:27
故事事故是这样的 新开发的jar包部署在老服务器上,版本是Red Hat Enterprise Linux AS release 4 (Nahant Update 5),提示需要高版本jdk,高版本jdk提示glibc版本太低得升级,是的,就像套娃。 使用编译源码的方式将glibc由2.3升级到2.9,升级完ls命令不好使了。 用LD_PRELOAD方法解决了ls命令不好使的问题后还挺有成就感的呢! 轻度强迫症的我当然要重启,然后 #reboot 就没有然后了。。 操作系统起不来了。各种尝试,最好的结果是卡死在 Starting cups-config-daemon: Starting HAL daemon: 再也不往下走了。007的服务器被996的程序员干进了ICU。 看到了吧,搞垮服务器可以显得很无辜。删库显得太刻意了,会被人指责性格有问题。 抢救思路 像《信条》一样进行一次逆过程,把glibc相关的静态库、动态库都用原来的低版本覆盖回来。cp覆盖和安装rpm覆盖一起上。 必要条件 能进机房,直接操作服务器,因为ssh此时已经连不上了。 有相同版本的Linux系统光盘,Linux抢救模式需要光盘引导。 有相同版本的Linux系统的iso镜像文件,用来获取rpm 【或者替代方法】 有相同版本的Linux系统的服务器或者虚拟机,用来下载.a文件 【或者替代方法】 准备工作

面试官:这道线程池场景题回答一下?想套路我,还不行

北城以北 提交于 2020-10-17 04:28:04
引言 一道面试题开始~~面试官:"假设我们有一个线程池,核心线程数为10,最大线程数也为20,任务队列为100。现在来了100个任务,线程池里现在有几个线程运行?"粉丝豪:"应该是10吧。"面试官:"你确定?"粉丝豪:"确定啊,就是10…"于是乎,粉丝豪就回去等通知了~ 此题的陷阱,大家如果看出来了,本文就不用看了!其实这道题正确的答案是"不一定!"因为并没指明是哪一种线程池机制,带着我们的疑问继续往下看! ps:不要纠结这题是不是咬文嚼字,现在人多如米,题目就是这样坑~ 正文 先进队列,到最大值,再起线程 这种情况是大家最容易想到的情况,因为JDK中的线程池,也就是ThreadPoolExecutor就是这种机制的! OK,我们先来看一下ThreadPoolExecutor的execute方法,如下图所示 看到三个红框了吧(其实源码里有解释),对应的三步分别是 (1)判断当前活跃线程数是否小于corePoolSize,如果小于,则调用addWorker创建线程执行任务 (2)如果不小于corePoolSize,则将任务添加到workQueue队列 (3)如果放入workQueue失败,则创建线程执行任务,如果这时创建线程失败(当前线程数不小于maximumPoolSize时),就会调用reject(内部调用handler)拒绝接受任务。 用一张图来解释如下 如图所示

记一次在mac上配置Maven 的JAVA_HOME的惨痛经历

心不动则不痛 提交于 2020-10-16 18:25:42
今天装好了了Maven3.3.3后,死活运行不了 CvdeMacBook-Pro:~ chenwei$ mvn Exception in thread " main " java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0 这个错误明显是运行的jdk版本低于编译的jdk版本,但是本地的jdk已经装成1.8了,maven3.3.3只需要1.7而已 CvdeMacBook-Pro:~ chenwei$ java - version java version " 1.8.0_51 " Java(TM) SE Runtime Environment (build 1.8 .0_51- b16) Java HotSpot(TM) 64 -Bit Server VM (build 25.51 -b03, mixed mode) 配置了JAVA_HOME依然没用(`/usr/libexec/java_home`意思是执行``中的内容替换,/usr/libexec/java_home是mac推荐的设置方式) CvdeMacBook-Pro:apache-maven- 3.3 . 3 chenwei$ cat ~/ .bash

2020.07.02-2020.07.05学习记录

泪湿孤枕 提交于 2020-10-16 15:00:05
2020.07.02 1.List.subList(beginIndex,endIndex) 获取列表中前endIndex个元素,返回值为list。 再说各个子类实现这个方法之前,先说一下"随机访问"的RandomAccess接口: ArrayList实现了一个叫做 RandomAccess 的接口,而 LinkedList 是没有的 。 RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。也就是说,实现了这个接口的集合是支持 快速随机访问 策略的。 如果是实现了这个接口的 List ,那么使用for循环的方式获取数据会优于用迭代器获取数据。 可以看一下Collections的binarySearch方法中对于这一点的运用:(by the way:二分查找的阈值是5000) AbstractList方法的内部实现: 如果不用这个api,我会怎么实现这个效果呢? 遍历获取,达到长度之后返回。这个明显要比这个api智障很多。所以恰当的设计子类,可以很好的实现这种效果。这是我第一次意识到子类还可以有这种作用。虽然知道了这个类的精妙之处,但是我想不出来哪里可以用到这一点,毕竟如果有需要,直接用list类的subList方法就好了。 然后实现这个功能,还可以用list.stream.limit这个api实现,也可以用内存分页实现

真香!阿里P8耗时半年著作660页Java高并发与网络编程实战总结

笑着哭i 提交于 2020-10-16 13:19:16
随着软件行业的飞速发展,互联网公司对开发者的技能要求也越来越高。而高并发、网络编程、微服务、海量数据的处理等技能,是每一个开发者进阶时的必学知识。 这份阿里大佬的实战总结笔记由核心技术、应用框架和数据处理三部分组成。 核心技术介绍了与高并发相关的架构设计及多线程、NIO、网络编程等底层技术 应用框架讲解了目前流行的一些高并发及分布式框架技术,如Disruptor Spring Boot、Spring Cloud等,这些技术也是目前在国内外互联网企业中被广泛应用的; 数据处理部分重点介绍了如何优化数据,如何使用关系型数据库、非关系型数据库及大数据领域的MapReduce技术处理海量数据,从而为高并发场景提供一套完善的存储方案。 总览 因为篇幅限制,下面小编会展示目录和详细内容截图,有需要获取完整文档的朋友帮忙点赞后,私信我【文档资料】就可以了(一定要记得关注我,不然没办法回复陌生人私信)。 第1章高并发概述 第2章系统分析与大型互联网架构设计 第3章高并发相关JVM与JDK新特性案例讲解 第4章实战解析多线程并发包 第5章分布式网络编程核心技术—远程调用 第6章NIO案例解析与高性能聊天室实战 第7章高性能NIO框架Netty实例详解 第8章主流RPC框架解析与跨语言调用案例 第9章实战解析高并发框架Disruptor 第10章手把手开发微服务构建框架Spring Boot

HashMap源码实现分析

杀马特。学长 韩版系。学妹 提交于 2020-10-15 20:58:14
HashMap源码实现分析 一、前言 HashMap 顾名思义,就是用hash表的原理实现的Map接口容器对象,那什么又是hash表呢。 我们对数组都很熟悉,数组是一个占用连续内存的数据结构,学过C的朋友对这一点影响肯定更为深刻。既然是一段连续的内存,数组的特点就显而易见了,一旦你知道要查第几个数据,时间复杂度就是O(1),但是对于插入操作就很困难;还有一种数据结构你也一定很熟悉,那就是链表,链表由一组指向(单向或者双向)的节点连接的数据结构,它的特点是内存不连续,查找困难,但是插入删除都很容易。 那有没有一种查找容易,插入删除查找都容易的数据结构呢, 没错,它就是hash表。 本篇,我们就来讨论: HashMap的数据结构实现方式 HashMap是怎么做到为get、put操作提供稳定的时间复杂度的 HashMap什么时候从单节点转成链表又是什么时候从链表转成红黑树 HashMap初始化时为什么要给自定义的初始容量。 HashMap如何保证容量始终是2的幂 HashMap为何要保证容量始终是2的幂 HashMap的hash值如何计算 HashMap为什么是线程不安全的 要了解HashMap 最好的方式就是看源码,本篇内容基于Jdk1.8HashMap源码。 二、HashMap的基本要素 磨刀不误砍柴功,想了解HashMap的原理,必然绕不过HashMap源码中的以下几个变量:

Java String的相关性质分析

泄露秘密 提交于 2020-10-15 19:53:09
引言 String可以说是在Java开发中必不可缺的一种类,String容易忽略的细节也很多,对String的了解程度也反映了一个Java程序员的基本功。下面就由一个面试题来引出对String的剖析。 1. String在源码里究竟是如何实现的,它有哪些方法,有什么作用? 从源码可以看出,String有三个私有方法,底层是由字符数组来存储字符串 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /**存储字符串的字符数组*/ private final char value[]; /** 缓存字符串的hashcode */ private int hash; // 默认是0 /** 用于验证一致性来是否进行反序列化 */ private static final long serialVersionUID = -6849794470754667710L; 1.1 String重要构造方法 // String 为参数的构造方法 public String(String original) { this.value = original.value; this.hash = original.hash; } // char[] 为参数构造方法

JAVA基础——Map集合,Map集合特点,根据键找值,寻找键和值,HashMap,TreeMap,LinkedHashMap的基本功能,hashtable与hashMap区别

China☆狼群 提交于 2020-10-15 18:40:53
一、 Map集合概述和特点 Map接口概述 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 Map接口和Collection接口的不同 Map是双列的,Collection是单列的 Map的键唯一,Collection的子体系Set是唯一的 Map集合的数据结构(TreeMap,hashMap)值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效 二、 Map集合的功能概述 1. 添加功能 V put(K key,V value) :添加元素。 如果键是第一次存储,就直接存储元素,返回null 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值 Map < String , Integer > map = new HashMap < String , Integer > ( ) ; //put的返回值是根据后面的值的类型相同 Integer i1 = map . put ( "张三" , 13 ) ; Integer i2 = map . put ( "李四" , 15 ) ; Integer i3 = map . put ( "王五" , 14 ) ; Integer i4 = map . put ( "赵六" , 16 ) ; Integer i5 = map . put ( "张三" , 16 ) ; /

Cannot create PoolableConnectionFactory (ORA-28040: No matching authentication protocol

余生长醉 提交于 2020-10-15 18:36:03
Oracle12c数据库报错信息如下图所示: 原因在于驱动jar包。Oracle12c针对不同的JDK版本提供了不同版本的ojdbc驱动包。 JDK版本 ojdbc驱动包 1.6 ojdbc6.jar 1.7 ojdbc7.jar 1.8 ojdbc7.jar(与1.7版本一致) 解决方案 Oracle12c给咱们准备了驱动包。大致位置:/u01/app/oracle/product/12.1.0/db_1/jdbc/lib 取出自己JDK对应JDK版本的驱动包。加入自己的应用中即可。并且旧的驱动包必须删除。例如 ojdbc14.jar。 来源: oschina 链接: https://my.oschina.net/u/4356413/blog/4674675