随笔分类 - javaSE
摘要:生产者消费者模型是我们学习多线程知识的一个经典案例,一个典型的生产者消费者模型如下: public void produce() { synchronized (this) { while (mBuf.isFull()) { try { wait(); } catch (InterruptedExc
阅读全文
摘要:JDK中为什么有了Synchronized还有Lock接口呢? 当回答这个问题的时候,有人会说是因为性能的原因。但你应该知道,自从JDK1.6以后,对synchronized进行了优化之后,synchronized又开始被推荐使用了,何况性能问题通过优化大多都是可以解决的,所以性能并不是Lock接口
阅读全文
摘要:字节缓冲区切片 直接看个例子: @Test public void test1() { byte[] bytes = new byte[]{1,2,3,4,5}; ByteBuffer byteBuffer = ByteBuffer.wrap(bytes); //使用slice之前,一般先调用pos
阅读全文
摘要:一、强引用 我们日常使用的都是强引用,如下: StringBuffer str = new StringBuffer("Hello World") 强引用的特点: 强引用可以直接访问目标对象 强引用所指向的对象在任何时候都不会被垃圾回收,虚拟机宁愿报OOM,也不会回收强引用所指向的对象 强引用可能会
阅读全文
摘要:一、如何从线程中返回信息 1、轮询 在新起线程中,设置一个标志字段,并提供一个get方法,main方法中轮询,判断这个标志字段的值。 该方案固然可行,但做了大量不需要的工作。 2、回调 直接看代码。:arrow_heading_down: 主线程: import javax.xml.bind.Dat
阅读全文
摘要:前言 如果面试官问: 是线程安全的么?如果ArrayList线程不安全的话,那你知道有哪些线程安全的集合么? 如果你答可以使用 、`Collections`下的方法对集合进行一层包装。 仅仅答到这的话,那太遗憾了,你要回去等通知了。 :sob: ArrayList线程不安全 我们知道 是线程不安全的
阅读全文
摘要::fist_right: 示例 例如,海底捞的服务员(线程),轮流处理每位客人的点餐(任务),如果为每位客人都配一名专属的服务员,那 么成本就太高了(对比另一种多线程设计模式:Thread Per Message) 注意,不同任务类型应该使用不同的线程池,这样能够避免饥饿,并能提升效率 例如,如果一
阅读全文
摘要::notebook_with_decorative_cover:上一篇文章介绍了线程池的基础知识,这节将更加深入;对于上一篇重复过的知识,这里不再赘述! :athletic_shoe: ThreadPoolExecutor 再看继承结构: 线程池状态 上一节中已经阐述了线程池的 五种状态 这对应于源
阅读全文
摘要:Java从JDK 1.5开始提供了java.util.concurrent.atomic包(以下简称Atomic包),这个包中 的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。 :baby_chick: 内部都是采用CAS+volatile实现了无锁并发 这节不讲原理,只讲如
阅读全文
摘要::star: 核心思想是通过通道对数据的生产者和消费者进行解耦,使二者不直接交互,从而使二者的处理速率相对来说不影响。 这里我们使用wait/notifyAll 代码如下: 运行结果: 可以看到队列满时,生产者等待,队列空时,消费者等待。 :flags: 其实上面这个代码,将生产者和消费者都整合进了
阅读全文
摘要:一、线程中断 中断可以理解为一个线程的标志位,与线程中断有关的方法 + interrupt方法 Thread类的实例方法:中断被调用线程,实际上只是改变了被调用线程 的内部中断状态, ==并不会中断线程== 必须注意API中的这一段描述 If this thread is blocked in an
阅读全文
摘要:一、 案例 这里service层的业务逻辑可能返回Null 使用 类进行优化 Java8中Optional的引入,使得开发避免了大量Null的出现,借助相关方法避免了if...else这种繁琐的逻辑代码编写,对于其应用,在处理空的场景下应用较多,对于ifelse的逻辑场景,同样使用Optional让
阅读全文
摘要:接上文连接: "StringTable" 测试用例: 如何测试呢,我们利用IDEA中的debug模式下的Memory框进行检测 这个 是用来分析jvm堆中的对象。 引用一下IDEA的官方介绍吧。 "Memory官方文档" The Memory view shows you the total num
阅读全文
摘要:首先看这样一个面试题 我们从字节码的角度来分析结果 首先反编译该类代字节码,输入命令: 得到结果: 我们从中摘取最重要的一段: 上面每句的意思可参照jvm指令手册去进行阅读 其他类似, 在索引9的位置: 这 就是创建了一个StringBuilder对象, "":()V调用了无参构造方法 即 调用了S
阅读全文
摘要:
阅读全文
摘要:java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带 来的函数式编程,引入了一个 全新的Stream概念 ,用于解决已有集合类库既有的弊端。 一、引言 传统集合的多步遍历代码 几乎所有的集合(
阅读全文
摘要:常用函数式接口 JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在 包中被提供。 下面是简单的几个接口及使用示例。 Supplier接口 接口仅包含一个无参的方法: 。用来获取一个泛型参数指定类型的对 象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要
阅读全文
摘要:在兼顾面向对象特性的基础上,Java语言通过Lambda表达式与方法引用等,为开发者打开了函数式编程的大门。 下面我们做一个初探。 Lambda的延迟执行 有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费。而Lambda表达式是延迟执行的,这正好可以 作为解决方案,提升性能。 性能浪费的日
阅读全文
摘要:一、Consumer:消费型接口(void accept(T t)) 举一个例子 二、其余三大内置函数接口,及衍生接口与这差不多,不再说了!
阅读全文
摘要:一、枚举类的使用 1. 枚举类的理解: 类的对象是有限个,确定的。 我们称此类为枚举类 2. 当需要定义一组常量时(订单状态,一年的季节,支付方式等),强烈建议使用枚举类 3. 如果枚举类中只有一个对象,则作为单例模式的实现方式(单例的写法之一) 二、如何定义枚举类 自定义枚举类 打印结果: Sea
阅读全文

浙公网安备 33010602011771号