JDK

ConcurrentHashMap详解

人走茶凉 提交于 2021-01-30 18:59:47
原文链接 http://zhhll.icu/2020/12/14/java%E5%9F%BA%E7%A1%80/%E9%9B%86%E5%90%88/ConcurrentHashMap%E8%AF%A6%E8%A7%A3/ ConcurrentHashMap详解 JDK7 Segment 在jdk8之前concurrentHashMap使用该对象进行分段加锁,降低了锁的粒度,使得并发效率提高,Segment本身也相当于一个HashMap,Segment包含一个HashEntry数组,数组中每个HashEntry既是一个键值对,又是一个链表的头结点 get方法 根据key做hash运算,得到hash值 通过hash值,定位到对应的segment对象 再次通过hash值,定位到segment当中数组的具体位置 put方法 根据key做hash运算,得到hash值 通过hash值,定位到对应的segment对象 获取可重入锁 再次通过hash值,定位到segment当中数组的具体位置 插入或覆盖hashEntry对象 释放锁 但是使用这种方式实现需要进行两次hash操作,第一次hash操作找到对应的segment,第二次hash操作定位到元素所在链表的头部 JDK8 在jdk8的时候参考了HashMap的设计,采用了数组+链表+红黑树的方式,内部大量采用CAS操作,舍弃了分段锁的思想

字符串编码的转换

不问归期 提交于 2021-01-30 15:34:02
1 package com.jdk7.chapter5; 2 3 import java.io.UnsupportedEncodingException; 4 5 public class ChangeCharsetTest { 6 // 公共的唯一静态变量 7 public static final String US_ASCII = "US-ASCII" ; 8 public static final String ISO_8859_1 = "ISO-8859-1" ; 9 public static final String UTF_8 = "UTF-8" ; 10 public static final String UTF_16BE = "UTF-16BE" ; 11 public static final String UTF_16LE = "UTF-16LE" ; 12 public static final String UTF_16 = "UTF-16" ; 13 public static final String GBK = "GBK" ; 14 15 public String toUS_ASCII(String str) throws UnsupportedEncodingException{ 16 return changeCharset(str,

实验四:201571030116/201571030106《小学四则运算练习软件需求说明》结对项目报告

心已入冬 提交于 2021-01-30 15:04:53
任务 1 : 以 实验二个人项目、实验三结对项目所开发的小学生四则运算练习软件作为原型,实施小学生四则运算练习软件用户调研活动。 由于上次作业小伙伴很机智的把软件的操作过程录成了 gif 动图,所以在做基于原型的用户需求调查时减少了很多麻烦。 对于这个任务我们采用了 三 种方法做用户需求调查: 1. 线上问卷调查 2. 真实用户线上访谈 3. 会议研讨 1. 线上问卷调查 : 地址: 我们通过前两次作业整理了一些问题,用 “问卷星”做了一份线上问卷调查,为了更精确的区分不同真实用户对软件的需求,我们把问卷调查分成了三个模块:小学生、老师和家长,通过对不同角色的用户需求调查来完善软件的功能。 以下是调查问卷的具体内容: 为了保证调查结果的准确性,我把问卷发给了假期做兼职时认识的小学培训班老师和我校数学与统计学院大四的师范类学长学姐还有自己家有上小学的小孩的亲戚,在他们的帮助下一共收到了 100 个真实用户的调查结果,以下是问卷调查分析: 通过分析调查问卷我们得到了以下结论: 1) 小学生(占 27% ) a. 大部分小学生还是在通过老师布置的课后练习和书店购买的习题集做四则运算练习,很少有用学习类 APP 的,说明这类 APP 目前在小学生群体中还不是很流行,大多数小学生还是比较习惯传统的练习方法(当然由于调查用户基数比较小,,不能以偏概全,但是至少在西部地区,状况应该是这样。

深度体验中国长城2020版笔记本电脑有感

╄→尐↘猪︶ㄣ 提交于 2021-01-30 05:40:36
深度体验中国长城2020版笔记本电脑有感 1. 背景交待 1.1. 初识Linux 第一次接触Linux是2004年,当时应该是RedFlag比较火的时候,Redhat 命名还是9的时候。在老唐(好同学)的诱导下玩得很嗨,加上第一台买的二手(老是折腾,但也学会修电脑了)玩得很HIGH,那时候理想特别单纯,就想做操作系统,为国争光。研究生也研究起了Linux内核,这一块虽然忘了,但捡起来也是可以的。所以一直玩到现在,折腾,体验也有自己的一翻体会。什么Mathematica、Matlab Linux下其实也都是很正常的。但,当Arm出来,x86原有的体系,虽然同样是Linux,但基因不一样的,Linux原本不成熟的生态在ARM上能跑的少之又少。 1.2. 本次接触初感 中国长城新发主机今年的广告比较多,宣传也相对到位。一直有关注它们的电竞比赛等,本身自己也在这个体系内,飞腾和KYLINOS的实力还是清楚,相对还是OK的,只是Linux生态先天性不足,但本次发布加上了技德的移动技术,支持安卓APP,让我满怀期待。偶然机会,得到一台FT2000-4核心的新款长城笔记本,初次接触做工与外观中规中矩,凭借着对Linux生态的了解,硬件到软件、从办公到程序开发、从磁盘读写到CPU与内存占用、从产品打磨各个角度进行细节化的体验,整个过程下来,有惊喜,也有遗憾,更有期待,这是对IT行业的期待

maven依赖中的<scope>provided</scope>

一笑奈何 提交于 2021-01-30 03:01:22
compile 默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布 provided 跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。???????? runtime 表示dependency不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。 test 表示dependency作用在测试时,不作用在运行时。 只在测试时使用,用于编译和运行测试代码。不会随项目发布。 system 跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它 来源: oschina 链接: https://my.oschina.net/u/4393390/blog/4933333

【Java深入理解】String、StringBuilder、StringBuffer的区别

随声附和 提交于 2021-01-30 00:54:11
在我们学习String类的时候,也会学习到StringBuilder和StringBuffer,但是他们之间有什么区别呢? 当然他们在具体的代码实现上、内存分配上以及效率上都有着不同(我这里以JDK8为例); 它们之间的区别: 一、代码实现 String StringBuilder StringBuffer 二、性能效率 String StringBuilder StringBuffer 三、内存分配 String StringBuilder和StringBuffer 完结 一、代码实现 String public final class String implements java . io . Serializable , Comparable < String > , CharSequence { /** The value is used for character storage. */ private final char value [ ] ; /** Cache the hash code for the string */ private int hash ; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final

Zookeeper安装与调优部署参考文档(Linux)

大城市里の小女人 提交于 2021-01-29 09:11:06
1. 安装环境准备 1.1 主机环境准备 1.1.1. 关闭selinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0 1.1.2. 软件下载 apache-zookeeper-3.6.1-bin.tar.gz: 下载地址 1.1.3. 部署规划 软件安装路径 /usr/local/zookeeper 端口规划 2192 1.1.4. 系统主机时间、时区、系统语言  本节视实际情况需要操作  修改时区 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  修改系统语言环境 echo 'LANG="en_US.UTF-8"' >> /etc/profile && source /etc/profile  配置主机NTP时间同步 yum -y install ntp systemctl enable ntpd && systemctl start ntpd echo 'server ntp1.aliyun.com' >> /etc/ntp.conf echo 'server ntp2.aliyun.com' >> /etc/ntp.conf 2. Zookeeper安装部署 2.1

Java并发编程之CAS和AQS

依然范特西╮ 提交于 2021-01-29 01:26:49
什么是CAS > CAS(compare and swap) ,字面意思比较并交换,是解决多线程并行情况下使用锁造成性能损耗的一种机制. public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); } > CAS 有三个操作数, valueOffset 内存值, expect 期望值, update 要更新的值。如果内存值( valueOffset )和期望值( expect )是一样的。那么处理器会将该位置的值更新为( update ),否则不做任何操作。 > CAS 有效地说明了“我认为位置 valueOffset 应该包含值 expect ,如果包含该值,则将 update 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”在 Java 中,sun.misc.Unsafe类提供了硬件级别的原子操作来实现这个 CAS,java.util.concurrent包下的大量类都使用了这个Unsafe类的 CAS 操作 CAS的应用 > java.util.concurrent.atomic 包下的类大多数是使用 CAS 实现的,如 AtomicInteger ,

Spring Cloud Openfeign 源码笔记

落爺英雄遲暮 提交于 2021-01-29 01:26:20
关键类分析 # 1.FeignAutoConfiguration 配置了一个管理 feign 子容器的工厂(FeignContext). 配置一个 Targeter, 直接中专 fegin 的 target 方法(DefaultTargeter, 这里扩展可以实现降级哦) 配置了一个 feign client (ApacheHttpClient), 用于执行 HTTP 请求 还配备了 ok http client 方式的 feign client, 但默认不启用 # 2.FeignClientsRegistrar 被 @EnableFeignClients 引入 扫描带 @FeignClient 注解的接口, 生成代理对象(FeignClientFactoryBean)注册到容器中 # 3.FeignClientFactoryBean 继承自 FactoryBean, Spring 的东西, getBean() 时调用跳转到 getObject() getObject() 会调用通过 feign 对象生成代理对象 # 4.FeignInvocationHandler JDK 动态代理生成对象的的方法拦截器 通过调用 SynchronousMethodHandler 的 invoke() 实现发送请求的功能 # 5.SynchronousMethodHandler invoke()

RabbitMQ 基础概念进阶

扶醉桌前 提交于 2021-01-28 13:41:34
上一篇 RabbitMQ 入门之基础概念 介绍了 RabbitMQ 的一些基础概念,本文再来介绍其中的一些细节和部分高级概念。 一、消息生产者发送的消息不可达时如何处理 RabbitMQ 提供了消息在传递过程中无法发送到一个队列(比如根据自己的类型和路由键没有找到匹配的队列)时将消息回传给消息发送方的功能,使用 RabbitMQ 的客户端提供 channel.basicPublish 方法的两个参数 mandatory 和 immediate (RabbitMQ 3.0 以下版本),除此之外还提供了一个备份交换器可以将无法发送的消息存储起来处理,不用重新传回给发送方。 1.1 mandatory 参数 mandatory 被定义在 RabbitMQ 提供的客户端的 channel.basicPublish 方法中,如下所示: 当把方法的 mandatory 参数设置为 true 时,那么会在交换器无法根据自身的类型和路由键找到一个符合要求的队列时,RabbitMQ 会自动调用 Basic.Return 把该消息回传给发送方也就是我们的消息生产者。反之,如果设置为 false 的话,消息就会被直接丢弃掉。那么问题来了,我们要如何去获取这些没有被发送出去的消息呢?RabbitMQ 给我们提供了事件监听机制来获取这种消息,可以通过 addReturnListener 方法添加一个