lambda表达式一定要在内部捕获受检异常?
摘要:场景 以调用java.util.ArrayList#forEach方法为例,用不同的lambda表达式重写该Consumer接口。 RuntimeException list中有两个元素,调用forEach遍历,使用lambda重写Consumer接口,抛出不受检异常RuntimeException
阅读全文
Java阻塞队列简介
摘要:个人理解 总体认知 本质上是**队列**,但是并不一定是FIFO的,比如PriorityBlockingQueue 阻塞: 线程的状态 生产者阻塞: 队列满 消费者阻塞: 队列空 只要对阻塞队列有一个整体的认知,相信理解其各种实现就很轻松了。 如果没有BlockingQueue 如果没有Blocki
阅读全文
volatile关键字简介
摘要:volatile的作用 保证变量在多线程中的可见性 保证指令的有序性(禁止指令重排) 保证变量在多线程中的可见性 主存中有一个变量a, 它被volatile关键字所修饰, 并且它的值是0 T1和T2线程读取了变量a, 此时它们的线程的本地内存(CPU寄存器或高速缓存)中的值都是0 如果T1修改了变量
阅读全文
Java GC知识总结
摘要:简介 Garbage Collectors本质上是JVM的一种线程, 它们有单线程的, 也有多线程的, 作用则是在特定的时机对垃圾对象进行清除, 回收内存; 追踪每一个对象, 如果有对象被标记为两次, 则下一次GC该对象会被清除; 即使在可达性分析算法中判定为不可达的对象, 也不是“非死不可”的,
阅读全文
协程的原理以及与线程的区别
摘要:1 什么是协程? 协程(coroutine)是一种程序运行的方式,即在单线程里多个函数并发地执行. A coroutine is a function that can suspend its execution (yield) until the given given YieldInstruct
阅读全文
将AtomicInteger对象作为方法的局部变量, 传递给其他线程, 读写操作是否是线程安全的?
摘要:将AtomicInteger对象作为方法的局部变量, 传递给其他线程, 读写操作是否是线程安全的? 场景 在main线程中, 有一个方法名为triggerSomeThreadWithMethodLocalVariable, 该方法会启动一些线程并且带着该方法里的一个类型为AtomicInteger的
阅读全文
Spring的@Import注解简单介绍
摘要:Spring的@Import注解 作用 将没有使用@Component注解的普通class加入到Spring容器, 由Spring管理 导入一个Configuration类(比如你想组合多个Java Config类到一个Java Config类, 或者你引入的第三方jar包中的Java Config
阅读全文
idea 设置编译方式为maven编译, 并且在编译Java源文件时debug(annotation processor)
摘要:idea 设置编译方式为maven编译 Settings → "Ctrl+F"搜索Maven → Runner → ✔上Delegate IDE build/run actions to Maven. 如下图所示: 编译时debug(annotation processor) 给需要编译的Maven
阅读全文
Java8线程池ThreadPoolExecutor底层原理及其源码解析
摘要:小侃一下 日常开发中, 或许不会直接new线程或线程池, 但这些线程相关的基础或思想是非常重要的, 参考林迪效应; 就算没有直接用到, 可能间接也用到了类似的思想或原理, 例如tomcat, jetty, 数据库连接池, MQ; 本文不会对线程的基础知识进行介绍, 所以最好已"进食"关于线程的基础知
阅读全文
Object#wait()与Object#wait(long)的区别,Object的wait方法与线程sleep方法的区别
摘要:例子 例1 最基础的等待-通知 例2 Object#wait(long)的参数大于0与等于0 测试类代码 大于0 等于0或Object#wait() 总结 例子 例1 最基础的等待-通知 下面一个例子,一个线程"waiting"在同步代码块调用了Object#wait()方法,另一个线程"timed
阅读全文
CompletableFuture的简单介绍以及使用例子
摘要:1. CompletableFuture的介绍 2. Future与CompletableFuture对比 3. CompletableFuture常用方法 3.1. CompletableFuture#runAsync 3.2. CompletableFuture#supplyAsync 3.3.
阅读全文
从一个小例子引发的Java内存可见性的简单思考和猜想以及DCL单例模式中的volatile的核心作用
摘要:环境 JVM被设置成-server模式的意义 场景 最初的代码 添加for循环耗时代码 用volatile解决内存可见性 去掉volatile,减少for循环次数,减少耗时 总结上面的几中情况 几种猜想(暂未证明) 耗时任务的意义 如何保证变量在内存中及时可见? Volatile保证变量在内存中及时
阅读全文
为什么SimpleDateFormat线程不安全?
摘要:为什么SimpleDateFormat线程不安全? 解决方法 为什么SimpleDateFormat线程不安全? SimpleDateFormat中有个属性calendar(protected Calendar calendar;)继承自DataFormat, 所以当不同的线程如果用的是同一个Sim
阅读全文
从原子类和Unsafe来理解Java内存模型,AtomicInteger的incrementAndGet方法和Unsafe部分源码介绍,valueOffset偏移量的理解
摘要:例子 i++的简单流程 众所周知,i++分为三步: 1. 读取i的值 2. 计算i+1 3. 将计算出i+1赋给i 保证i++操作的线程安全 用锁和volatile 可以使用锁来保持操作的原子性和变量可见性,用volatile保持值的可见性和操作顺序性; 从一个小例子引发的JAVA内存可见性的简单思
阅读全文
Java8 stream collect groupBy分组的简单例子
摘要:实体类People,有个返回list的buildPeopleList方法,方便测试。 import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructo
阅读全文
OAuth 第三方登录授权码(authorization code)方式的小例子
摘要:假如上面的网站A,可以通过GitHub账号登录; 下面以OAuth其中一种方式,授权码(authorization code)方式为例。 一、第三方登录的原理 所谓第三方登录,实质就是 OAuth 授权。 数据的所有者告诉系统,同意授权第三方应用进入系统,获取数据。系统从而产生一个短期的进入令牌(t
阅读全文
源码查看Thread.interrupted()和Thread.currentThread().isInterrupted()区别
摘要:JAVA线程状态、线程START方法源码、多线程、JAVA线程池、如何停止一个线程等多线程问题 这两个方法有点容易记混,这里就记录一下源码。 Thread.interrupted()和Thread.currentThread().isInterrupted()区别 静态方法Thread.interr
阅读全文
Java 中函数式编程方法形参为基本类型和引用类型
摘要:简单复习下 基本数据类型值传递 值传递,原变量的值不会被修改 传递数组类型的引用 结果值全部为1,全部被修改 方法形参为对象 * 如果在方法内部修改该对象的属性,外部引用属性值会跟着变化* 如果在方法内部修改该引用,外部不会发生变化
阅读全文
HTTPS原理
摘要:HTTP存在的问题 以下均是客户端http请求一次服务端可能出现的问题,即服务端向客户端响应请求,返回数据: 1. 明文传输,内容不加密:个人隐私、账户密码等信息可能会被盗取。2. 篡改,数据的完整性和安全性:收到的数据可能被第三方修改过,或被植入广告等。3. 假冒,服务端的身份未认证:访问的站点非
阅读全文
ThreadLocal源码原理以及防止内存泄露
摘要:ThreadLocal的原理图 在线程任务Runnable中,使用一个及其以上ThreadLocal对象保存多个线程的一个及其以上私有值,即一个ThreadLocal对象可以保存多个线程一个私有值。 (重点)每一个线程Thread对象,都有一个threadLocals属性; 核心属性,因为每个Thr
阅读全文