JDK

Java多线程编程基础三(原子性,可见性和有序性)

会有一股神秘感。 提交于 2020-10-02 20:38:42
文章引用: 1 https://www.jianshu.com/p/cf57726e77f2 2 https://blog.csdn.net/eff666/article/details/66473088 当前文章可以结合下面链接一起了解一下: https://blog.csdn.net/u013412772/article/details/80107643 在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。 一、原子性 即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。原子性就像数据库里面的事务一样,他们是一个团队,同生共死。 一个很经典的例子就是银行账户转账问题:比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。试想一下,如果这2个操作不具备原子性,会造成什么样的后果。假如从账户A减去1000元之后,操作突然中止。然后又从B取出了500元,取出500元之后,再执行 往账户B加上1000元 的操作。这样就会导致账户A虽然减去了1000元,但是账户B没有收到这个转过来的1000元。 所以这2个操作必须要具备原子性才能保证不出现一些意外的问题。同样地反映到并发编程中会出现什么结果呢?举一个简单的例子: i = 0 ; //1 j = i ; //2 i++; //3

彻底解决unable to find valid certification path to requested target

谁都会走 提交于 2020-10-02 20:22:44
安装证书。 下载证书 第一步是要下载证书 去你程序要访问的网站,点击那个锁按钮,并点击查看详情(chrome浏览器) 点击View certificate 点击详细信息 复制到文件 下一步 选择格式 生成的名称,最后保存 这里我保存在的D盘根目录下叫abc.cer 导入证书 切换到jre的/lib/security/下 执行如下命令 keytool - import -alias abc -keystore cacerts -file D: //abc.cer 其中: -alias 指定别名(推荐和证书同名) -keystore 指定存储文件(此处固定) -file 指定证书文件全路径(证书文件所在的目录) 注意:当切换到 cacerts 文件所在的目录时,才可指定 -keystore cacerts, 否则应该指定全路径; 此时命令行会提示你输入cacerts证书库的密码,敲入changeit即可,这是java中cacerts证书库的默认密码,当然也可自行修改。 库密钥口令输入:changeit 将会看到如下的信息 是否信任:Y 证书导入成功 查看证书,密钥仍然是changeit keytool -list -keystore cacerts - alias vbooking 至此证书导入成功。 注意:导入证书过程中,可能会遇到一个问题,如下所示 keytool 错误: java

学习 JAVA,有什么书籍推荐?学习的方法和过程是怎样的?

我与影子孤独终老i 提交于 2020-10-02 20:01:34
现在互联网上资源丰富,Java 学习并不难。贴个 Java 服务端入门和进阶指南,是给我们组新人入门用的,包括了学习目标、需要掌握的技能和参考资料,并规划了学习阶段和时间,希望帮助到题主。 前言 欢迎加入我们。这是一份针对实习生/毕业生的服务端开发入门与进阶指南。遇到问题及时问你的 mentor 或者直接问我。 建议: 尽量用 google 查找技术资料。 有问题在 stackoverflow 找找,大部分都已经有人回答。 多看官方的技术文档。 ibm developerworkers 的文章质量整体上有保障。 平时花一些时间在 github 上阅读优秀项目源码。 入门(1-2 个月) 目标:参与简单的项目开发。 技能: 掌握 Java。经典的《Java 核心技术:卷1 基础知识》(或者《Java 编程思想》)必看,跳过其中的图形和 applet 章节。习惯查阅 Java API Doc。为了保证代码的质量,《Effective Java》、《Clean Code》和《重构》也需要至少通读一遍。 熟悉 Linux 开发环境和 bash shell。Linux 是我们的开发和部署环境,你最好尽快熟练它。Linux 的基本使用可以通过《鸟哥的Linux私房菜:基础学习篇(第三版)》学习,开发 bash shell 脚本可以参考《Linux Shell脚本攻略》。 掌握开发工具

超值干货 | 值得收藏:精选BATJ面试突击500题详解:JVM篇!

笑着哭i 提交于 2020-10-02 15:24:30
JVM Java内存区域 说一下 JVM 的主要组成部分及其作用? 说一下 JVM 运行时数据区 深拷贝和浅拷贝 说一下堆栈的区别? 队列和栈是什么?有什么区别? HotSpot虚拟机对象探秘 对象的创建 为对象分配内存 处理并发安全问题 对象的访问定位 句柄访问 直接指针 内存溢出异常 Java会存在内存泄漏吗?请简单描述 垃圾收集器 简述Java垃圾回收机制 GC是什么?为什么要GC 垃圾回收的优点和原理。并考虑2种回收机制 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? Java 中都有哪些引用类型? 怎么判断对象是否可以被回收? 在Java中,对象什么时候可以被垃圾回收 JVM中的永久代中会发生垃圾回收吗 说一下 JVM 有哪些垃圾回收算法? 标记-清除算法 复制算法 标记-整理算法 分代收集算法 说一下 JVM 有哪些垃圾回收器? 详细介绍一下 CMS 垃圾回收器? 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别? 简述分代垃圾回收器是怎么工作的? 内存分配策略 简述java内存分配与回收策率以及Minor GC和Major GC 对象优先在 Eden 区分配 大对象直接进入老年代 长期存活对象将进入老年代 虚拟机类加载机制 简述java类加载机制? 描述一下JVM加载Class文件的原理机制 什么是类加载器

你知道什么是 Restful 风格吗?SpringMVC 带我们实现它!

让人想犯罪 __ 提交于 2020-10-02 14:17:33
Restful 风格的 API 是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和 约束条件 。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 在 Restful 风格中,用户请求的 url 使用同一个 url 而用请求方式:get,post,delete,put...等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口。 SpringMVC Restful 风格 url 配置实现的方式 SpringMVC 的 resturl 是通过 @RequestMapping 及 @PathVariable annotation 提供的,通过如 @RequestMapping(value="/blog /{id}",method=RequestMethod.DELETE) 即可处理 /blog/1 的 delete 请求。 GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的 方式。 POST(CREATE):在服务器端新建一个资源,调用 insert 操作。 PUT(UPDATE):在服务器端更新资源,调用 update 操作。 PATCH(UPDATE):在服务器端更新资源(客户端提供改变的属性)。

Java基础知识一周学习总结

坚强是说给别人听的谎言 提交于 2020-10-02 12:51:23
Java基础知识一周总结 认识Java Java语言是一种强类型语言,在Java语言中英文字母的大小写等这些都有规定,知道Java是一种强类型语言之后,我们再来了解与Java语言息息相关的JDK,jdk是Java语言的开发工具,jdk中又包含jre 和jvm,jre是Java语言的运行环境,jvm是虚拟计算机,使Java语言能够在不同的操作系统上都能够运行,从而我们便可以知道Java语言的特点:跨操作系统和可移植性,不同的操作系统下载安装相应的jdk后都要对jdk进行环境变量的配置,可以让Java程序在不同的盘符下运行。 关键字、标识符、常量 关键字 关键字就是被Java语言特定含义的单词,组成关键字的单词全部小写。 class、public、static、void、interface、extend、abstract、相关的数据类型等都是关键字 class:定义一个类(Java中最基本的单元) public:权限修饰符(公开的公共的) private:私有的,外界不能访问 protected:受保护的权限修饰符 static:静态修饰符 void:跟方法有关系(讲解Java中如何定义方法) 注意事项:goto,const这两个单词不是关键字作为保留使用 标识符 标识符就是给类、接口、方法、变量其名字的字符序列 给类和接口起名是一样的如果类(接口)组成的是一个单词:首字母大写

阿里面试官最喜欢问的21个HashMap面试题

放肆的年华 提交于 2020-10-02 10:59:06
1.HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过 8 时,链表转换为红黑树。 transient Node<K,V>\[\] table; 2.HashMap 的工作原理? HashMap 底层是 hash 数组和单向链表实现,数组中的每个元素都是链表,由 Node 内部类(实现 Map.Entry接口)实现,HashMap 通过 put & get 方法存储和获取。 存储对象时,将 K/V 键值传给 put() 方法: ①、调用 hash(K) 方法计算 K 的 hash 值,然后结合数组长度,计算得数组下标; ②、调整数组大小(当容器中的元素个数大于 capacity * loadfactor 时,容器会进行扩容resize 为 2n); ③、i.如果 K 的 hash 值在 HashMap 中不存在,则执行插入,若存在,则发生碰撞; ii.如果 K 的 hash 值在 HashMap 中存在,且它们两者 equals 返回 true,则更新键值对; iii. 如果 K 的 hash 值在 HashMap 中存在,且它们两者 equals 返回 false,则插入链表的尾部(尾插法)或者红黑树中(树的添加方式)。(JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法)(注意:当碰撞导致链表大于

reactive stream协议详解

北城余情 提交于 2020-10-02 10:31:50
背景 Stream大家应该都很熟悉了,java8中为所有的集合类都引入了Stream的概念。优雅的链式操作,流式处理逻辑,相信用过的人都会爱不释手。 每个数据流都有一个生产者一个消费者。生产者负责产生数据,而消费者负责消费数据。如果是同步系统,生产一个消费一个没什么问题。但是如果在异步系统中,就会产生问题。 因为生产者无法感知消费者的状态,不知道消费者到底是繁忙状态还是空闲状态,是否有能力去消费更多的数据。 一般来说数据队列的长度都是有限的,即使没有做限制,但是系统的内存也是有限的。当太多的数据没有被消费的话,会导致内存溢出或者数据得不到即使处理的问题。 这时候就需要back-pressure了。 如果消息接收方消息处理不过来,则可以通知消息发送方,告知其正在承受压力,需要降低负载。back-pressure是一种消息反馈机制,从而使系统得以优雅地响应负载, 而不是在负载下崩溃。 而reactive stream的目的就是用来管理异步服务的流数据交换,并能够让接收方自主决定接受数据的频率。back-pressure就是reactive stream中不可或缺的一部分。 更多内容请访问 www.flydean.com 什么是reactive stream 上面我们讲到了reactive stream的作用,大家应该对reactive stream有了一个基本的了解

图解 JVM 核心知识点(面试版)

╄→尐↘猪︶ㄣ 提交于 2020-10-02 10:01:02
一、基本概念 1.1 OpenJDK 自 1996 年 JDK 1.0 发布以来,Sun 公司在大版本上发行了 JDK 1.1 、 JDK 1.2 、 JDK 1.3 、 JDK 1.4 、 JDK 5 , JDK 6 ,这些版本的 JDK 都可以统称为 SunJDK 。之后在 2006 年的 JavaOne 大会上,Sun 公司宣布将 Java 开源,在随后的一年多里,它陆续将 JDK 的各个部分在 GPL v2(GNU General Public License,version 2)协议下开源,并建立了 OpenJDK 组织来对这些代码进行独立的管理,这就是 OpenJDK 的来源,此时的 OpenJDK 拥有当时 sunJDK 7 的几乎全部代码。 1.2 OracleJDK 在 JDK 7 的开发期间,由于各种原因的影响 Sun 公司市值一路下跌,已无力推进 JDK 7 的开发,JDK 7 的发布一直被推迟。之后在 2009 年 Sun 公司被 Oracle 公司所收购,为解决 JDK 7 长期跳票的问题,Oracle 将 JDK 7 中大部分未能完成的项目推迟到 JDK 8 ,并于 2011 年发布了JDK 7,在这之后由 Oracle 公司正常发行的 JDK 版本就由 SunJDK 改称为 Oracle JDK。 在 2017 年 JDK 9 发布后,Oracle

JAVA自学笔记(8)—IO流

帅比萌擦擦* 提交于 2020-10-02 09:46:51
IO流(流?) 1.0 概念和分类 2.0 字节 输出 流 (1)输入一个字节 import java.io.FileOutputStream; import java.io.IOException; public class Main{ public static void main(String[] args) throws IOException { FileOutputStream fos=new FileOutputStream("Demo01\\a.txt"); fos.write(97); fos.close(); } }    (2)多个字节的输入 import java.io.FileOutputStream; import java.io.IOException; public class Main{ public static void main(String[] args) throws IOException { FileOutputStream fos=new FileOutputStream("Demo01\\b.txt"); byte bytes[]={65,66,67,68};//ABCD //第一种 fos.write(bytes); //第二种 fos.write(bytes,1,3); //第三种 String s="你好,很高兴认识你";