java
时间都哪去了
拥有10多年的经验,精通分布式存储、分布式事务、分布式缓存相关技术、dubbo、Spring Cloud分布式微服务架构
、深度学习框架Tensorflow、Scikit-learn
展开
-
深度解析volatile内存语义与原理
Java关键字volatile的作用1、内存可见性2、禁止指令重排序可见性是指,在多线程环境,共享变量的操作对于每个线程来说,都是内存可见的,也就是每个线程获取的volatile变量都是最新值;并且每个线程对volatile变量的修改,都直接刷新到主存。下面重点介绍指令重排序。为什么要指令重排序?为了提高程序执行的性能,编译器和执行器(处理器)通常会对指令做一些优化(重排序)1、编译器重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序;2、处理器重排序。如原创 2020-11-15 10:23:10 · 181 阅读 · 0 评论 -
理解Synchronize和ReentrantLock不同
目录介绍1.Synchronize和ReentrantLock区别 1.1 相似点 1.2 区别 1.3 什么是线程安全问题?如何理解 1.4 线程安全需要保证几个基本特性 2.Synchronize在编译时如何实现锁机制 3.ReentrantLock使用方法 4.ReentrantLock锁机制测试案例分析 4.1 代码案例分析 4.2 什么时候选择用ReentrantLock 4.3 公平锁和非公平锁有何区别 5.问答测试题 5.1 ReentrantLo原创 2020-11-15 09:47:07 · 224 阅读 · 0 评论 -
深入理解Java 线程的状态及转换
操作系统中的线程状态转换1. 新建线程一个java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上java程序天生就是一个多线程程序,包含了:(1)分发处理发送给给JVM信号的线程;(2)调用对象的finalize方法的线程;(3)清除Reference的线程;(4)main线程,用户程序的入口。那么,如何在用户程序中新建一个线程了,只要有三种方式: 通过继承Thread类,重写run方法; 通过实现runable接口; 通过实现c原创 2020-11-14 19:00:38 · 93 阅读 · 0 评论 -
java常用数据结构解析
常用的数据结构有八种: 数组(Array),栈(Stack),链表(Linked List),图(Graph),队列(Queue),树(Tree),堆(Heap),散列表(Hash)List 有序,可重复ArrayList内部是使用动态数组来实现的,对于数据的随机get和set或是少量数据的插入或删除,查询效率会比较高。ArrayList是线程不安全的,在不考虑线程安全的情况下速度也比较快的。ArrayList插入数据可以重复,也是有序的,按照插入的顺序来排序。底层数据结构数组,查..原创 2020-11-04 10:43:15 · 223 阅读 · 0 评论 -
操作系统的用户态和核心态切换条件以及为什么要切换
我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU 寄存器和程序计数器什么是 CPU 上下文CPU 寄存器和程序计数器就是 CPU 上下文,因为它们都是 CPU 在运行任何任务前,必须的依赖环境。CPU 寄存器是 CPU 内原创 2020-09-06 17:34:30 · 4375 阅读 · 0 评论 -
java多线程“锁”事
前言Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:1. 乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关原创 2020-09-05 11:43:45 · 118 阅读 · 0 评论 -
Java垃圾回收机制 | 可达性分析,垃圾收集器
一个对象的一生经历了什么? 如何判断对象是否可用? 引用计数法和可达性分析算法各有什么优缺点? 哪些对象可以作为GC ROOT? 垃圾回收的时候如何快速寻找到根节点?(安全点和OopMap) 垃圾回收算法有哪些?各有什么优缺点? 有哪些垃圾回收器?各有什么优缺点?适用什么场景1、对象回收处理过程2、判断用户是否可用算法2.1、引用计数算法如上图,给对象一个引用计数器refCount。每有一个对象引用它,计数器加1,当refCount=0的时候,表示对象不再可用。缺点原创 2020-08-29 14:13:18 · 414 阅读 · 0 评论 -
太好了!总算有人把动态代理、CGlib、AOP都说清楚了!
Java 代理模式实现方式,主要有如下五种方法静态代理,工程师编辑代理类代码,实现代理模式;在编译期就生成了代理类。 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxyInstance动态构建全新的代理类(继承Proxy类,并持有InvocationHandler接口引用 )字节码文件并实例化对象返回。(jdk动态代理是由java内部的反射机制来实例化代理对象,并代理的调用委托类方法) 基于CGlib 动态代理模式 基于继承被代理类生成代理子类,不用实现接口。只需要被代转载 2020-08-27 20:55:41 · 241 阅读 · 0 评论 -
Java8 lambda使用教程
1.Java8 新特性介绍Lambda表达式函数式接口StreamOptionalPredicateFunctionConsumerFilterMap-Reduce新的Date API最核心的当然是函数式编程了2.Java8 lambda使用总结基础类@Data@Builder@AllArgsConstructor@NoArgsConstructorpublic class Person { private int id; private原创 2020-08-25 13:54:04 · 337 阅读 · 0 评论 -
探究ThreadLocal解决了什么问题?
理解误区关于 ThreadLocal 的适用场景以及解决的问题,描述的都并不是很清楚,甚至误人子弟的。比如下面是常见对于 ThreadLocal的介绍(wrong)ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。在小明大量阅读和动手实验后得出结论:ThreadLocal 并不是像上面所说为了解决多线程共享变量的问题。正确理解ThreadLoal 变量,它的基本原理是,同一个 ThreadLoc.原创 2020-08-07 09:37:42 · 222 阅读 · 0 评论 -
Java 8新特性之新的时间和日期API
Java 8另一个新增的重要特性就是引入了新的时间和日期API,它们被包含在java.time包中。借助新的时间和日期API可以以更简洁的方法处理时间和日期。在介绍本篇文章内容之前,我们先来讨论Java 8为什么要引入新的日期API,与之前的时间和日期处理方式有什么不同?在Java 8之前,所有关于时间和日期的API都存在各种使用方面的缺陷,主要有:Java的java.util.Date和java.util.Calendar类易用性差,不支持时区,而且他们都不是线程安全的; 用...原创 2020-07-08 18:34:45 · 268 阅读 · 0 评论 -
高并发系列 - JUC中的原子类
JUC中原子类介绍什么是原子操作?atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰,所以,所谓原子类说简单点就是具有原子操作特征的类,原子操作类提供了一些修改数据的方法,这些方法都是原子操作的,在多线程情况下可以确保被修改数据的正确性。JUC中对原子操作提供了强大的支持,这些类位于java.util.concur.原创 2020-06-22 17:17:51 · 314 阅读 · 0 评论 -
Java反射优化之方法句柄
1 简介方法句柄中包含两个重要的类,MethodHandle和MethodTypeMethodHandle通过句柄我们可以直接调用该句柄所引用的底层方法。从作用上来看,方法句柄类似于反射中的Method类,是对要执行的方法的一个引用,我们也是通过它来调用底层方法,它调用时有两个方法invoke和invokeExact,后者要求参数类型与底层方法的参数完全匹配,前者则在有出入时做修改如包装类型。MethodType方法签名不可变对象,是对方法的一个映射,包含返回值和参数类型。在looku.原创 2020-07-05 16:36:39 · 625 阅读 · 0 评论