Java核心复习——CompletableFuture】的更多相关文章

介绍 JDK1.8引入CompletableFuture类. 使用方法 public class CompletableFutureTest { private static ExecutorService threadPool = new ThreadPoolExecutor(40, 100, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(20)); public String B() { System.out.println(&qu…
第一眼看到AbstractQueuedSynchronizer,通常都会有这几个问题. AbstractQueuedSynchronizer为什么要搞这么一个类? 这个类是干什么的.有什么用? 这个类的实现原理是什么? 下面我边学边教,来解答这3个问题. 问题一:AbstractQueuedSynchronizer产生的背景 AbstractQueuedSynchronizer 我这里用简写AQS表示.如果开发者想自己定义一个同步器怎么写?Java程序员用C++写个同步器不现实,这时如果有一个用…
一.线程池的介绍 线程池一种性能优化的重要手段.优化点在于创建线程和销毁线程会带来资源和时间上的消耗,而且线程池可以对线程进行管理,则可以减少这种损耗. 使用线程池的好处如下: 降低资源的消耗 提高响应的速度 提高线程的可管理性 二.线程池的使用 public class ThreadPoolExecutorDemo { static class Worker implements Runnable{ @Override public void run() { try { Thread.slee…
一. 产生并发Bug的源头 可见性 缓存导致的可见性问题 原子性 线程切换带来的原子性问题 有序性 编译优化带来的有序性问题 上面讲到了 volatile 与可见性,本章再主要讲下原子性.有序性与Happens-Before规则. 二.线程切换带来的原子性问题 count += 1 这一句高级语言的语句,往往需要多条CPU执令.可以分为3步: 将count值加载到寄存器 在寄存器中对count进行+1操作 将count值写回内存 所以,我们需要在高级语言的层面上,确保一些操作是原子性操作. 三.…
一.CountDownLatch 文档描述 A synchronization aid that allows one or more threads to wait until* a set of operations being performed in other threads completes. 是一个同步帮助工具,允许一个或多个线程等待一系列其他线程操作完后,再执行. count down 倒计时 latch 插锁 在Java中Latch结尾的也叫 闭锁 简单示例 public c…
一.概念 利用锁机制实现线程同步,synchronized关键字的底层交由了JVM通过C++来实现 Java中的锁有两大特性: 互斥性 同一时间,只允许一个线程持有某个对象锁. 可见性 锁释放前,线程对变量的修改,后面获得锁的线程可见. 二.用法 synchronized修饰位置与锁的关系: 同步方法 -- 对象锁,当前实例对象 静态同步方法 -- 类对象锁,当前对象的Class对象 同步方法块 -- 对象锁,synchonized括号里配置的对象 public class Synchroniz…
一.介绍 volatile保证共享变量的"可见性".可见性指的是当一个线程修改变量时,另一个线程能读到这个修改的值. 这里就要提出几个问题. 问题1:为什么一个线程修改时,另一个线程可能会"看不见"? 问题2:这种可见性是如何实现的? 二.问题1 变量为何"不可见" 回答:是由于缓存导致的可见性问题 2.1 为什么要引入缓存? 是为了解决性能问题.CPU的处理速度远远快于内存的读取速度(CPU与内存之间的瓶颈也叫"冯诺依曼瓶颈"…
ThreadLocal,叫做线程本地存储,也可以叫做线程本地变量.ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量. 一.如何使用 class Accessor implements Runnable { private final int id; public Accessor(int id) { this.id = id; } @Override public void run() { while (!Thread.currentThread(…
参考文档 LinkedBlockingQueue和ArrayBlockingQueue的异同…
介绍 依赖关系 源码 构造方法 public ArrayBlockingQueue(int capacity) { this(capacity, false);//默认构造非公平的有界队列 } public ArrayBlockingQueue(int capacity,//指定队列大小 boolean fair,//指定是否使用公平锁 Collection<? extends E> c//指定初始化时加入集合 ) { this(capacity, fair); //初始化ReentrantL…
一.ArrayList 介绍 ArrayList是List接口可变数组的实现. 特点 非线程安全 查找和修改效率高 二.ArrayList 使用方法 remove元素 @Test public void testRemove(){ List<String> strings = new ArrayList<>(); strings.add("a"); strings.add("b"); strings.add("c"); s…
Java 核心编程API与高级编程实践 第一章 异常 1.1 异常概述 在程序运行中,经常会出现一些意外情况,这些意外会导致程序出错或者崩溃而影响程序的正常执行,在java语言中,将这些程序意外称为异常,出现异常时称为异常处理. 1.2 异常引入 public class TestEx { public static void main(String[] args){ String teachers[] ={"柳海龙","孙传杰","孙悦"};…
突然发现自己Java基础的底子不到位,复习! 所记知识会发布在CSDN与博客网站jirath.cn <Java基础复习>-常识与入门 一.Java语言的知识体系图 分为三部分 编程语言核心结构:变量.基本语法.分支.循环.数组 Java面向对象的核心逻辑:OOP(面向对象编程).封装.继承.多态.接口...... JavaSE高级应用程序:异常.集合.线程.IO.反射.网络 二.常识与概述 计算机能直接识别的是机器指令,机器指令的封装是汇编语言,汇编语言再向上是高级语言如C,C++,Java…
先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. 二哥,你好,找工作找了仨月,还没有找到,很焦虑,我该怎么办呢?你那有没有 Java 方面的面试题可以分享一波啊? 以上是读者田田给我发的私信,看完后于我心有戚戚焉啊,最近境况确实不容乐观,并非是个人的原因造成的.那,既然需要面试题,二哥就义不容辞,必须得准备一波. 这次我花了一周的时间,准备了 31…
先看再点赞,给自己一点思考的时间,微信搜索[沉默王二]关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有一线大厂整理的面试题,以及我的系列文章. 二哥,你好,找工作找了仨月,还没有找到,很焦虑,我该怎么办呢?你那有没有 Java 方面的面试题可以分享一波啊? 以上是读者田田给我发的私信,看完后于我心有戚戚焉啊,最近境况确实不容乐观,并非是个人的原因造成的.那,既然需要面试题,二哥就义不容辞,必须得准备一波. 这次我花了两周的时间,准备了 62…
java复习: 类的管理及常用工具类 包 写在程序文件的第一行 一个Java 源文件中只能声明一个包, 且声明语句只能作为源文件的第一条指令 导入类能导入非public类,但是不能用因为在其他包缺省的权限用不了 package Testp; import Testpackage.*; public class C { public static void main(String[] args) { A a=new A(); B b=new B(); } }//Testpackage.*只能导入…
java基础复习记录(数组.对象.异常) 数组 数组的定义 数组是相同类型数据的有序集合.如:篮球队就是一个数组,队员球服上有号码,相当于索引.通过某一个的某一个号码来确认是某一个队员.数组中索引从0开始. 数组创建声明 1.首先必须声明数组变量,一下为声明数组变量的语法: dataType[] arrayRefVar; // 使用首选 或 dateType arrayRefVar[]; // 一般不用 int[] a; //创建变量名为a,数组类型为int的数组 int a[]; 2.java…
在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这解释: 多态性是Java面向对象的一个重要机制,本文将向您详细介绍Java语言中多态性的实现原理和方法,通过多态一点带出更多Java面向对象有趣而实用的知识. 多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详…
2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final. 还有另一个解释: 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final的例子,例如java.lang.String.为String类指定final防止了人们覆盖length()方法. 另外,如果指定一个类为final,则该类所有的方法…
主题:Java反射机制 学习资料参考网址: 1.http://www.icoolxue.com 1.Java反射机制. 各种框架中都使用到了Java的反射机制. 两个类:java.lang.Class:java.lang.ClassLoader. 2.ClassLoader类. ClassLoader并非加载一次,是动态加载.需要的时候才加载.static语句块只执行一次.ClassLoader负责把类load到内存. 当我们执行Java程序的时候,首先执行JVM,然后再把java class加…
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之间,海底光缆是如何横跨太平洋的.“所谓的铺设,就是直接扔进海里,只不过再扔之前需要勘探光缆经过的地区的年水流数据,海域水深等情况,基本都是扔在水比较浅且水流平稳的地区.”目前,同样有卫星无线通信. 网络通信的协议约束:通信协议的分层思想(编程的时候,无需了解光缆,还是宽带): 在网络编程中,有两个问…
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图开始讲起.线程状态转换图.图很简单不要想得太复杂.了解了线程的基本的生命周期,那么我们要使用好它,就离不开了经常使用的几个方法:先来一段代码: public class TestSleep { public static void main(String[] args){ MyThread t =…
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一个水桶上. 字节:字符:字:管道对01010的封装. java.io.*包中的类.类的分类.Java提供的流的这些类,可以帮你把原始的数据010101转换成字符串.为数据的读取提供了更强大的功能. 程序从文件中读010101的数据. inputStream和outputStream 一个字节是8位.…
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String s2 = “hello”:结论:s1 == s2. 字符串常量放在data区. 3. String s3 = new String("hello"); String s4 = new String("hello");结论:s3 != s4.但s3.equals(s4).…
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时,不能指定其长度.不同于C 数组的小标可以是整型常量或整型表达式. .length方法是显示数组的长度:数组.length;String.length();一个是属性,一个是方法.注意区分. 2.数组的内存分析? Array a[]; a = new Integer(15); /*这个a在栈中,在堆…
类的加载: 指的是将class文件的二进制数据读入到运行时数据区(JVM在内存中划分的) 中,并在方法区内创建一个class对象. 类加载器: 负责加载编译后的class文件(字节码文件)到JVM(Java虚拟机)当中. 而类加载器主要分为以下几种: 1.Bootstrap class loader (引导类加载器) 负责加载Java核心类库.在jre\lib目录下,包括rt.jar(Java基础类库),这些 都是Java的核心类库.而且这个加载器是由C语言编写的,所以在Java程序中是获取 不…
深入Java核心 Java内存分配原理精讲 栈.堆.常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,详细讲解Java内存分配方面的知识. Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对…
1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过start方法启动线程--->线程变为可运行可执行状态,然后通过数据产生共享,线程产生互斥---->线程状态变为阻塞状态---->阻塞状态想打开的话可以调用notify方法. 这里Java5中提供了封装好的类,可以直接调用然后构造阻塞状态,以保证数据的原子性. 2.如何实现? 主要是实现Blo…
一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A->B->C 二.实现 1.分析 在前面文章java核心知识点学习----多线程并发之线程间的通信,notify,wait,曾实现过需求两个线程间隔循环的例子.涉及到3个线程就使用之间的方法就有点麻烦了,这里借着刚学的Lock锁可以很方便实现互斥,但如何实现三个线程间的通信呢? 2.实现效果 3.实现代码…
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); 2.如何使用锁? 可以参看Lock文档,其使用格式如下: class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until c…