![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础
文章平均质量分 81
Java面试365
为什么每次都是差一点差一点,因为每次做事情都是差不多差不多
展开
-
JAVA8时间工具类转换
转换过程总结起来相对简单,Date类和JDK1.8推出的LocalDate、LocalDateTime、LocalTime类之间的转换可以通过ZonedDateTime做桥梁,至于JDK1.8新出的类就可以通过API自己转换,转换细节如图所示。原创 2022-09-29 10:23:39 · 1463 阅读 · 0 评论 -
JAVA8时间工具类
因为JDK1.7的时间工具类Date和Calendar存在安全性问题,同时大多数API 都已过时,所以JDK1.8重新规划了时间工具类,这些工具类的核心如下Instant:瞬时实例。LocalDate:本地日期,不包含具体时间 例如:2020-01-01。LocalTime:本地时间,不包含日期。LocalDateTime:组合了日期和时间,但不包含时差和时区信息。ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。Duration:表示一个时间段。原创 2022-09-29 10:20:37 · 745 阅读 · 0 评论 -
JAVA时间存储类Period和Duration
在JDK1.8中区分了时间和日期的概念,所以有了两个对应的类,LocalDate和LocalTime,区别如下LocalDate表示日期,不会包含具体的时间,例如2022-09-26。LocalTime表示时间,不会包含日期,仅仅包含时分秒。简单使用如下区分了时间和日期的概念后,为方便使用JDK1.8又推出了两个用于存储时间和日期的类,分别为Duraction和Period,这两个类的区别和LocalDate和LocalTime是一一对应的。原创 2022-09-27 11:40:25 · 454 阅读 · 0 评论 -
JAVA时间戳类Instant
在JAVA8之前的版本,去获取时间戳(毫秒级别)常用的办法有两种由于Date类大部分方法已经废弃,而且上面两种方法的时间戳只能精确到毫秒级别,所以我们有必要了解下jdk1.8推出的Instant类,该类可以将时间戳精确到级别。原创 2022-09-26 20:25:35 · 1677 阅读 · 0 评论 -
Optional判空操作
JAVA在1.8版本推出Optional,官方文档将其描述为,目前Optional用于避免程序出现异常NullPointerException。原创 2022-07-18 16:57:16 · 2936 阅读 · 0 评论 -
不一样的UniCode
UniCode其实是一种编码标准,也被称为万国码,单一码,是计算机科学领域里的一种业界标准,Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。我们在跨平台开发时就可以采用UniCode统一解决编码问题,那么UniCode仅限于解决编码问题吗?当然绝对不是,UniCode还可以玩的花里胡哨。看下面一个案例,到底能输出什么值呢?这个明眼一看,这不是非常简单吗?JAVA并不会执行注释内容,所以打印出来的原创 2022-06-17 23:43:02 · 483 阅读 · 0 评论 -
Future获取任务返回值
Future获取任务返回值submit方法签名在向线程池ThreadPoolExecutor提交任务时,一般为了方便操作采用execute提交任务,这时线程其实是无返回值的,但是在生产中为了应对各种各样的需求,获取线程返回值是必不可少的,所以SDK提供另一种任务提交方式submit,方法签名如下// 提交Runnable任务Future<?> submit(Runnable task);// 提交Callable任务<T> Future<T> submit(C原创 2022-03-05 09:28:01 · 4699 阅读 · 0 评论 -
JAVA线程池
线程池为什么采用线程池在Java中创建线程看着就像创建一个对象,继承Thread或者实现Runnable接口都可以实现,但其实并不是那么简单,创建对象需要JVM分配内存空间,而创建线程则需要调用操作系统API来实现,同时操作系统还需要分配资源给线程使用,非常的消耗资源同时线程的销毁也是如此,所以线程是一个重量级的对象,应该避免经常性的创建和销毁。所以这时候就需要用到线程池这个概念,池化思想在很多中间件都有使用数据库连接池,常量池等等,池化思想的主要目的就是复用,减少资源的重复创建。提到池化思想,大多原创 2022-03-03 19:17:08 · 174 阅读 · 0 评论 -
原子类无锁并发利器
原子类无锁并发利器前言引入当存在如下场景,两个线程同时去将count值累加一万次,那么如下代码是否存在线程安全问题呢?public class Test2 { public static void main(String[] args) throws InterruptedException { TestCount testCount = new TestCount(); Thread T1 = new Thread(()->{ t原创 2022-03-02 15:05:35 · 115 阅读 · 0 评论 -
如何让多线程步调一致
如何让多线程步调一致场景引入假设存在业务场景,电商系统有一个对账系统,该对账系统就是先查询订单库再查询派送单库,然后执行对账逻辑,将它们的差异写入差异库,逻辑如下所示。将场景代码化如下:while(存在未对账订单){ // 查询订单 pos = getPOrders(); // 查询派送单 dos = getDOrders(); // 执行对账逻辑 diff = check(pos, dos); // 差异数据入库 save(diff);}这种写法在数据量少的原创 2022-03-01 14:03:32 · 175 阅读 · 0 评论 -
读写锁的增加版--StampedLock
读写锁的增加版–StampedLock前言读写锁ReentrantReadWriteLock的优势比一般互斥锁大了不少,因为它支持读读不互斥,读写互斥,写写互斥,对于读多写少的场景简直是yyds,是不是读写锁在读多写少的场景就独霸一方了呢?当然不会,JDK1.8推出了读写锁的增强版StampedLock。什么是StampedLockStampedLock依旧是一种读写锁,只是它对比ReentrantReadWriteLock将性能进行了进一步优化。ReentrantReadWriteLock支持两原创 2022-02-28 16:04:12 · 154 阅读 · 0 评论 -
ReadWriteLock读写锁
ReadWriteLock读写锁前言现在我们知道了并发原语信号量和管程可以解决所有的并发问题,但是SDK并发包中却包含其它工具类这是重复造火箭吗?当然不是,工具包突出的是分场景优化性能,提升易用性。例如实际开发中一般存在如下业务场景,为了提升性能将一些基础数据、元数据等加入缓存提升读写效率,而且一般加入缓存后的数据改动少,读取次数多,针对这类业务场景SDK工具包就提供读写锁ReadWriteLock的解决方案,读写锁的效率高于一般互斥锁。什么是读写锁读写锁并不是JAVA所特有的,这是一个通用的技术原创 2022-02-26 16:55:00 · 337 阅读 · 0 评论 -
Semaphore信号量
Semaphore信号量什么是信号量信号量由著名计算机科学家迪杰斯特拉(Dijkstra)于 1965 年提出,提出后的15年对并发编程领域是统治地位,直到1980年管程的提出才有了第二选择。信号量以前也称为红绿灯,车能不能过取决于信号灯让不让过,并发编程也是,线程能不能执行取决信号量让不让放行。信号量模型信号量模型主要分为一个计数器、一个等待队列、三个方法,信号量模型规定只能通过三个方法来访问计算器和等待队列,模型如下所示。对应三个方法有如下解释:init方法:信号量计算器初始化方法。d原创 2022-02-25 23:14:04 · 245 阅读 · 0 评论 -
并发包中的管程
并发包中的管程什么是Lock和Condition并发包SDK中存在管程的另一个实现即Lock和Condition,其中Lock可以解决互斥问题,Condition可以解决管程的同步问题(通信和协作)。读到这里有人肯定马上就有疑问了,用synchronized实现的管程完全可以解决互斥和同步问题,为什么要在SDK中重新实现一种管程方式呢?这不是多此一举吗?没错synchronized确实可以解决互斥和同步问题,但是存在即合理,回答这个问题之前先回顾下死锁问题成立的四大条件。互斥(同一时间资源只有一原创 2022-02-23 23:43:55 · 59 阅读 · 0 评论 -
线程数设置多少合适
线程数设置多少合适为什么要使用多线程使用多线程本质上是提升性能,性能可能直接理解为快!快就完事了,但是这样的说法太笼统,那应该如何度量性能呢?度量性能最常用的指标为吞吐量和延迟,延迟指一个请求从发送到收到响应这个过程的时间,延迟越短意味着程序处理的越快,性能就越好,而吞吐量指的是单位时间内能处理的请求数量,吞吐量越大表示性能越好,但是需要注意的是这两个指标属于不同维度(延迟是时间维度,吞吐量是空间维度)并不能互换。所以使用多线程的目的就是降低延迟、提升吞吐量,那多线程如何去做呢?这就要从多线程的应用原创 2022-02-22 19:20:39 · 2300 阅读 · 0 评论 -
为什么局部变量线程安全
为什么局部变量线程安全我们知道方法内部定义的变量属于局部变量,而局部变量的作用域仅仅存在一个方法的内部,不能被外部所引用,那这到底是为什么呢?场景引入假如存在方法计算斐波那契数列,什么是斐波那契数列呢,就是第一项和第二项都是1,从第三项开始,每一项都是前两项的和形如:1、1、2、3、5、8、13…那么多线程下变量r是否存在线程安全的问题呢?public class Test { public int[] fibonacci(int n){ int[] r = new int原创 2022-02-22 00:16:50 · 4714 阅读 · 0 评论 -
线程生命周期
线程生命周期通用生命周期一般的线程生命周期大致分为五大部分,如图所示。初始状态,从程序角度上来将已经创建线程,但是操作系统层面还没有创建线程,这是编程语言所特有的。就绪状态,也叫可运行状态这时操作系统已经创建了线程,只需要获取时间片就可以运行。运行状态,刚刚获取时间片就进入运行状态。休眠状态,从运行状态由于阻塞读取或者不满足条件变量则进入休眠状态,等到条件变量满足就从休眠状态变为就绪状态,等待获取时间片即可执行。终止状态,一般是线程执行完毕,或者发生异常结束线程。那是不是所有的编程语言原创 2022-02-18 21:56:42 · 321 阅读 · 0 评论 -
并发万能钥匙管程
并发万能钥匙管程什么是管程管程对应英文Monitor,英文直译为监视器,所谓管程指的是用来管理共享变量以及对共享变量的操作过程让其支持并发。管程在发展过程中有三种管程模型,Hasen模型、Hoare模型和MESA模型,目前使用最多的是MESA模型,并且JAVA管程的实现也是参考MESA模型。管程之所以能称作并发万能钥匙是因为并发的一切问题管程都有方案解决,例如并发的两大核心问题,互斥即同一个时刻只允许一个线程访问共享资源,同步指线程间如何通信和协作,管程都有答案。并发问题之互斥管程解决互斥问题很原创 2022-02-17 19:01:18 · 246 阅读 · 0 评论 -
并发编程需要注意的问题
并发编程需要注意的问题一个并发程序的执行遇到的问题可谓是千奇百怪,我们从微观的角度能把并发问题分为CPU缓存导致的可见性问题。编译优化带来的排序问题。线程切换带来的原子性问题。但学习讲究微观和宏观相结合,所以这里聊聊宏观角度上的并发编程问题。安全性问题什么称作线程安全呢?线程安全即是指程序能按照我们预期的结果执行,那是不是所有的线程都要检查并发程序是否存在安全性问题呢?当然不是,只有当多个线程同时读写同一个共享变量,这时候就需要考虑安全性问题。既然安全性问题的本质就是因为读取了共原创 2022-02-16 20:44:05 · 438 阅读 · 0 评论 -
死锁的来龙去脉
死锁的来龙去脉前言引入之前有提到过一把锁保护多个资源,如果是多个资源间存在关联关系,如账户A给账户B转账,一把锁怎么锁住同一个资源呢?当时只是采用简单的方法,锁住整个类模板Account.class方法解决,如下代码。public class Account { private Integer balance; // 新增代码结束 public void transfer( Account target, int amt){ // 获取锁 使用类模板原创 2022-02-15 20:52:38 · 150 阅读 · 0 评论 -
WeakReference弱引用
WeakReference弱引用什么是弱引用顾名思义,弱引用,当一个对象仅仅被weak reference(弱引用)指向并且没有其它对象strong reference(强引用)指向,这时GC运行那么这个对象将被回收。WeakReference类weakreference类只有两个构造方法public WeakReference(T referent) { super(referent);}/**和上诉构造方法的区别是多了一个引用队列,当GC回收对象时,将引用对象回收而将被引用对象原创 2022-02-14 20:55:00 · 428 阅读 · 0 评论 -
并发锁如何保护多个资源
并发锁保护多个资源对于互斥锁而言受保护的资源和锁的关系一般都是多对一,那么如何用一把互斥锁去保护多个资源呢?首先需要区分多个资源之间是否有关联。多个资源之间不存在关联多个资源之间不存在关联如球场的座位和电影院的座位它们之间不存在强关联关系,两个资源分别使用球赛的门票和电影院的门票管理即可。例如银行中存在两种业务,银行账户余额取款业务和银行账户密码更改业务,两种资源之间并没有关联性,所以可以将两种资源分别赋予一把锁管理。代码如下所示public class Account { // 余额原创 2022-02-13 21:18:43 · 2543 阅读 · 0 评论 -
如何解决并发可见性和有序性
如何解决并发可见性和有序性前言并发的三大问题分别是可见性、原子性、有序性,其中可见性和有序性问题应该如何解决呢?目前了解到可见性是因为CPU缓存引起,而有序性是因为编译器优化了程序导致,想要彻底解决两大问题比较粗暴的办法就是禁用CPU缓存以及禁止编译器优化,那么这样直接会导致程序运行速度直线下降,影响程序运行不可取。那只能按需禁用CPU缓存和编译器优化,至于何时禁用CPU缓存和编译器优化呢?这个只有程序员知道,所以JVM提出JMM(JAVA内存模型)其规范了按需禁用CPU缓存以及编译器优化的规则原创 2022-02-12 16:31:45 · 226 阅读 · 0 评论 -
并发BUG的源头
并发BUG的源头前言机器的存储设备常见的一般是CPU、内存、I/O设备,计算速度也是由高到低,它们之间的差异可能高达几十倍,但是有些程序必须要访问内存或者I/O设备,根据木桶定律,程序的响应速度取决于计算速度最慢的存储设备即I/O设备。为了平衡这些差异CPU、操作系统、编译程序做出如下处理。CPU增加缓存以平衡内存和CPU之间的速度差异。操作系统增加进程、线程、以分时复用,进而均衡CPU和I/O设备的速度差异。编译程序优化指令执行次序,更加合理的利用缓存。缓存的可见性问题单核时代单核时原创 2022-02-11 23:54:14 · 528 阅读 · 0 评论 -
面试题02-玩转单例模式
单例模式1、什么叫单例模式这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意点:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。不需要实例化该类对象就可以访问。2、单例实现介绍**实现意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。**主要解决:**一个全局使用的类频繁地创建与销毁。**何时使用:**当您想控制原创 2021-03-25 16:20:42 · 148 阅读 · 1 评论 -
线程停止的三种方式超详细
线程停止的几种方式1、简单粗暴法Stop此方法已经废弃,不建议使用,jdk帮助文档有如下解释1.1、从代码执行结果层面解释package com.study.test;public class ThreadStopTest { public static void main(String[] args) throws InterruptedException { StopTest stopTest = new StopTest(); stopTest.s原创 2021-02-24 23:25:16 · 3778 阅读 · 0 评论 -
面试事务问题
MySQL的四种事务隔离级别一、事务的基本要素(特点)(ACID)1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。3、隔离性(Isolation):同一时间,只允原创 2020-12-24 15:40:21 · 129 阅读 · 0 评论 -
JUC的8锁现象
JUC的8锁现象声明:本例题来自于B站,狂神说,传送门https://www.bilibili.com/video/BV1B7411L7tE1、8锁问题 第一组package com.study.lock8;import java.util.concurrent.TimeUnit;/** * 8锁问题 第一组 * 1.phone中的两个方法被synchronized修饰,然后开启两个线程去调用,是先打电话还是先发短信 * 2.TimeUnit.SECONDS.sleep(4);休原创 2020-12-04 11:39:24 · 85 阅读 · 0 评论