Java基础
文章平均质量分 84
纯Java基础相关的知识点,如java新特性(8~);java 集合;java io/nio; concurrent; 等。示例源码地址:https://gitee.com/moon_2012/java-se
elegent Developer
每周一篇博文^_^
展开
-
6. Java并发编程-并发包-Lock和Condition
前文介绍了java语言本身通过synchronized, wait, notify实现了管程,解决了并发编程两大难题:互斥和同步。 这两大问题并发包中也得到了相应的实现,分别时Lock和Condition。众所周知,java并发包是并发大师Doug Lea精心打造,他这么做的原因是什么?原来的语言级实现有哪些不足吗?确实如此,以互斥锁为例,并发包中的Lock新增了三个功能:1)支持响应中断支持超时支持非阻塞获取锁如何保证可见性可见性是并发三大挑战之一,其余两个是:有序性和原子性。 原子性原创 2022-07-06 16:31:02 · 253 阅读 · 1 评论 -
5. Java并发编程-Java线程状态、生命周期
首先Java中的线程对应到OS中的线程,深刻理解了OS中的线程学习Java中线程是非常简单的。线程生命周期中涉及到五个状态,分别是:new(初始), ready(就绪), running(运行), block(阻塞)和terminated(终止)new, ready, runnning, terminated比较好理解,重点分析一下block。当运行态的线程调用了一个阻塞API(如读写文件),在条件变量上等待(wait),休眠(sleep), 等待其他线程结束(join)等,此时进入block状态。Java原创 2022-07-06 14:54:58 · 194 阅读 · 0 评论 -
4. Java并发编程-管程
并发编程已经发展很多年,自分时OS以来就已经存在,相关的理论和技术非常多。 这其中的管程是解决并发编程的关键技术。指的是管理共享变量以及对共享变量的操作过程,让它们支持并发。 在Java领域即管理类的成员变量和方法,让这个类是线程安全的。管程的英文是:Monitor, 直译是监视器,在OS领域可意译为管程。在OS课程中,我们都会学到信号量,知道可用信号量实现互斥锁和同步变量,分别用来解决并发的两大核心问题:互斥和同步(线程间通信,协作)。而管程和信号量其实是等价的,即:可用信号量实现管程,也能用管程实现信原创 2022-07-05 15:47:25 · 604 阅读 · 0 评论 -
3. Java并发编程-wait & notify
上一节示例中破除占用且等待条件时,如果当前不能满足可以同时持有两个资源锁的时候,当前线程自旋,空耗CPU。如果等待时间不长,或并发压力不大时,也是一个不错的方案。但相反,则严重浪费CPU。此种场景下,最好的方法是:如果线程不满足条件则阻塞自己,进入等待状态,当满足条件时阻塞的线程被唤醒,重新执行,这样就能避免空耗CPU的问题。线程首先获取到互斥锁,当线程要求的条件不满足时,释放互斥锁,进入等待状态;当要求的条件满足时,通知等待的线程,重新获取互斥锁。使用synchronized搭配wait(), notif原创 2022-07-04 17:29:31 · 229 阅读 · 0 评论 -
2. Java并发编程-互斥锁、死锁
即一个或多个操作在CPU执行的过程中不被中断的特性。一段代码同一时刻只有一个线程运行,称为互斥。 当我们能保证对共享变量的写是互斥的,就能保证原子性 了。将一段需要互斥执行的代码称为临界区。1)当修饰静态方法时,锁定的是当前类Class对象2)当修饰非静态方法时,锁定的是当前对象一组互相竞争资源的线程因相互等待,导致永久阻塞的现象。一旦发生死锁通常没有好的方法,只能重启应用。 重点是在预防死锁。死锁发生的条件:1)互斥,共享资源A和B只能被一个线程占用2)占有且等待,线程一已经取得了资源A,在等待B资原创 2022-07-04 15:52:12 · 268 阅读 · 0 评论 -
1. Java并发编程-Java内存模型
可见性的原因是CPU缓存,不同CPU之间缓存的数据互相之间不可见。有序性的原因是编译优化(指令重排序)原子性的原因是一条高级指令可能对应多个CPU指令,而OS只能保证CPU指令的原子性。解决可见性和有序性可以通过禁用CPU缓存和禁用编译优化实现,但这样会严重影响程序性能,合理的方案应该是按需禁用。Java内存模型规范了JVM如何提供按需禁用缓存和编译优化的方法,具体包括:volatile, synchronized和final关键字以及六项Happens-Before规则。这个关键字不是Java语言特有原创 2022-07-04 13:49:49 · 104 阅读 · 0 评论 -
10. Java8新特性-新日期和时间API
彻底弄懂GMT、UTC、CST、时区和夏令时格林威治时间、世界时、祖鲁时间、GMT、UTC、跨时区、夏令时,这些眼花缭乱的时间术语,我们可能都不陌生,但是真正遇到问题,可能又不那么确定,不得不再去查一查,处理完可能过段时间又忘记。今天,我们彻底来梳理一下它们。GMTGMT: Greenwich Mean Time, 即格林威治平时(也称格林威治时间),它规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。为什么是英国,因为近代的世界秩序是由英国发起的。1884年10月在美国华盛顿原创 2022-01-24 16:02:20 · 649 阅读 · 0 评论 -
9. Java8新特性-Optional
主要内容:为什么要避免null引用从null到Optional读取Opational中可能值的几种方法null引用的由来1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法。Hoare选择null引用这种方式,“只是因为这种方法实现起来非常容易”。如何减少NullPointerException通常可以采用防御式编程来减少NullPointerException。 如:public String getCarInsuranceNa原创 2022-01-20 11:40:08 · 592 阅读 · 0 评论 -
8. Java8新特性-默认方法(default method)
传统上(< JDK8)接口中定义的方法都是public abstract的,都是没有实现的,实现接口的类必须为接口中定义的每一个方法提供实现,否则会有编译错误。但一旦库的设计者需要更新接口,向其中加入新的方法,这种方式就会出现问题。 因为现存的实现类都不在库设计者的控制范围内,当项目升级JDK版本后,这些实体类为了适配更改后的接口,需要再修改,尤其是JDK8是非常重要的版本更新增加了大量方法。所以库设计者为了避免出现大规模更改代码,方便大家升级到JDK8,引入了新的机制,即JDK8之后接口现在支持原创 2022-01-19 16:13:58 · 1424 阅读 · 0 评论 -
7. Java8新特性-并行数据处理(parallel)
在JDK7之前,并行处理数据集合非常麻烦。首先需要自己明确的把包含数据的数据结构分成若干个子部分,第二需要给每个子部分分配一个独立的线程;第三需要在恰当的时候对它们进行同步来避免不希望出现的竞争条件,等待所有线程完成,最后把这些部分合并起来。Doug Lea 在JDK7中引入了fork/join框架,让这些操作更稳定,更不易出错。本节主要内容:1. 用并行流并行处理数据2. 并行流的性能分析3. fork/join框架4. 使用Spliterator分割流学完本节期望能达到:1. 熟练使用并原创 2022-01-18 13:49:14 · 6780 阅读 · 1 评论 -
6. Java8新特性-用流收集数据(Advanced)
本节重点内容:用Collectors类创建和使用收集器将流归约为一个值数据分组和分区开发自己的自定义收集器之前的几节已经分析了流的操作,可分为两类:中间操作和终端操作。 中间操作(filter, map, flatMap)可以链接起来将一个流转化为另一个流,这些操作本身不会消耗流,其目的是建立一个流水线。而终端操作(forEach, reduce, findFirst, findAny, count等)会消耗流,以产生一个最终结果。之前我们已经使用过一个终端操作collect(toList(原创 2021-09-02 10:44:19 · 223 阅读 · 1 评论 -
5. Java8新特性-使用流(Using Stream)
本节会详解介绍如何使用流,以发挥出它的强大功能,主要包括:1)筛选,切片,匹配2)查找,匹配和归约3)使用数值范围等数值流4)从多个源创建流5)无限流筛选和切片用谓词筛选Stream接口支持filter方法,该方法接收Predicate谓词,而Predicate之前已经介绍了是函数式接口,所以我们可以很方便的传递lambda,对流元素做筛选。筛除重复的元素类似sql中的distinct关键字,Stream接口也提供了distinct方法,用于将重复元素过滤出去,如:List<In原创 2021-08-25 10:08:46 · 356 阅读 · 0 评论 -
4. Java8新特性-什么是流(Stream)
本节重点内容什么是流集合与流内部迭代与外部迭代中间操作与终端操作流是什么?流是Java API的新成员,它允许你以声明式的方式处理数据集合(通过查询语句表达,而不是现写一个实现),可以把它看作遍历数据集的高级迭代器。另外,流还可以透明的并行处理,无须写多余的多线程代码。先看一段示例,以比较传统方法和流处理集合的不同:// 现有一批菜肴,需要筛选出卡路里小于400且按卡路里排序,最后打印菜肴的名称// java8之前的写法public static void main(String原创 2021-08-23 17:41:15 · 311 阅读 · 2 评论 -
3. Java8新特性-通过行为参数化传递代码
行为参数化:让方法接受多种行为作为参数,并在内部使用,来完成不同的行为。行为参数化可以让代码更好的适应不断变化的要求,减轻未来的工作量。过去我们也一直实践行为参数化传递代码,如执行集合排序,java API提供了Collections.sort方法,传递两个参数,第一个是待排序集合,第二个是Comparator。这是一个典型的策略模式,即针对一组算法,将每个算法封装到具有共同接口的独立类中,从而使得它们可以互相替换,却不影响主体逻辑。过去我们行为参数化很多情况下采用传递匿名内部类实例的形式,如:/*原创 2021-08-18 17:42:42 · 380 阅读 · 0 评论 -
2. Java8新特性-为什么需要关心Java8
原因:Java8所做的改变,在许多方面比Java历史上任何一次改变都深远,且熟练掌握它们会让你编程更容易,效率更高。优点一:简化代码如,在Java8之前,写一个对集合排序的程序需要这样写:Collections.sort(inventory, new Comparator<Apple>() { public int compare(Apple a1, Apple a2){ return a1.getWeight().compareTo(a2.getW原创 2021-08-18 14:56:49 · 149 阅读 · 0 评论 -
1. JDK版本变迁和各版本新特性
JDK从1995年发布起至今已历经20多年,从JDK1.0升级到JDK16(2021年8月),本节先一起回顾一下JDK的版本变迁和各版本的新特性版本变迁1995年5月23日,Java语言诞生;1996年1月,第一个JDK-JDK1.0诞生;1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术;1996年9月,约8.3万个网页应用了Java技术来制作;1997年2月18日,JDK1.1发布;1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议纪原创 2021-08-17 17:27:51 · 6584 阅读 · 1 评论